735. 行星碰撞
735. 行星碰撞
給定一個整數數組 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
向右移動。 由于移動方向相同的行星不會發生碰撞,所以最終沒有行星發生碰撞。
來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/asteroid-collision
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
題目分析:
遍歷數組,每次得到的數字,要么是正數,要么是負數。
根據題意,負數是向左走,正數是向右走。
前后兩次遍歷到的數字,總共有四種可能,即:
從上面的分析可以看出,如果前一個數是負數的話,不可能與后一個數發生爆炸,如果前一個數是正數的話,則會爆炸,保留誰,則要看二者之間的大小關系:
- 正數+負數=0,兩個數都沒了
- 正數+負數<0,保留負數
- 正數+負數>0,保留正數
程序設計
用棧保存結果
遍歷數組,當前遍歷到item
- 如果item是整數,則保存在棧中
- 如果是負數,會不會爆炸則與棧頂元素有關。
- 步驟一
- 如果棧是空的,則保存item,
- 如果棧頂是負數,不爆炸,item入棧
- 如果棧頂top是正數,爆炸,
1)top + item > 0,則不保存item,繼續下一輪的遍歷
2)top + item == 0,則不保存item,同時彈出top,繼續下一輪的遍歷
3)top + item < 0, 即top沒有item的絕對值大,則需要彈出top, item繼續與棧頂元素比較,跳到步驟一處進行比較。
總結
- 上一篇: 格式化输出--对齐及补全
- 下一篇: if else复合语句