劍指 Offer II 037. 小行星碰撞(中等)
阿新 • • 發佈:2021-08-14
通過率52.4%
題目描述:
給定一個整數陣列 asteroids,表示在同一行的小行星。
對於陣列中的每一個元素,其絕對值表示小行星的大小,正負表示小行星的移動方向(正表示向右移動,負表示向左移動)。每一顆小行星以相同的速度移動。
找出碰撞後剩下的所有小行星。碰撞規則:兩個行星相互碰撞,較小的行星會爆炸。如果兩顆行星大小相同,則兩顆行星都會爆炸。兩顆移動方向相同的行星,永遠不會發生碰撞。
示例 1:
輸入:asteroids = [5,10,-5]
輸出:[5,10]
解釋:10 和 -5 碰撞後只剩下 10 。 5 和 10 永遠不會發生碰撞。
示例 2:
輸入:asteroids = [8,-8]
輸出:[]
解釋:8 和 -8 碰撞後,兩者都發生爆炸。
示例 3:
輸入:asteroids = [10,2,-5]
輸出:[10]
解釋:2 和 -5 發生碰撞後剩下 -5 。10 和 -5 發生碰撞後剩下 10 。
示例 4:
輸入:asteroids = [-2,-1,1,2]
輸出:[-2,-1,1,2]
解釋:-2 和 -1 向左移動,而 1 和 2 向右移動。 由於移動方向相同的行星不會發生碰撞,所以最終沒有行星發生碰撞。
提示:
2 <= asteroids.length<= 104
-1000 <= asteroids[i] <= 1000
asteroids[i] != 0
思路:
由題可知,只有一種情況下兩顆小行星才會發生碰撞,即左邊的小行星向右移動(元素值為正),右邊的小行星向左移動(元素值為負)
然後可以根據兩個元素和的正負情況來判斷誰會保留,若為正,則保留左邊,為負保留右邊,為0兩者都不保留
1 /*JavaScript*/ 2 /** 3 * @param {number[]} asteroids 4 * @return {number[]} 5 */ 6 //23:37 7 var asteroidCollision = function(asteroids) { 8 for(let i=0; i<asteroids.length-1; ) { 9 if(asteroids[i]>0 && asteroids[i+1]<0) {10 if(asteroids[i]+asteroids[i+1] > 0) { 11 asteroids.splice(i+1, 1) //移除右邊小行星 12 }else if(asteroids[i]+asteroids[i+1]<0){ 13 asteroids.splice(i, 1) //移除左邊小行星 14 i-- 15 }else { 16 asteroids.splice(i, 2) //兩者都移除 17 i-- 18 } 19 }else { 20 i++ 21 } 22 } 23 return asteroids 24 };
不過用splice方法實現用時偏多,想必可以用棧的方法優化一下,之後再來補充吧~