1. 程式人生 > 其它 >劍指 Offer II 037. 小行星碰撞(中等)

劍指 Offer II 037. 小行星碰撞(中等)

通過率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方法實現用時偏多,想必可以用棧的方法優化一下,之後再來補充吧~