1. 程式人生 > 其它 >LeetCode刷題(棧) --735. 行星碰撞

LeetCode刷題(棧) --735. 行星碰撞

技術標籤:演算法leetcode演算法stack

題目

給定一個整數陣列 asteroids,表示在同一行的行星。

對於陣列中的每一個元素,其絕對值表示行星的大小,正負表示行星的移動方向(正表示向右移動,負表示向左移動)。每一顆行星以相同的速度移動。

找出碰撞後剩下的所有行星。碰撞規則:兩個行星相互碰撞,較小的行星會爆炸。如果兩顆行星大小相同,則兩顆行星都會爆炸。兩顆移動方向相同的行星,永遠不會發生碰撞。

示例 1:

輸入: 
asteroids = [5, 10, -5]
輸出: [5, 10]
解釋: 
10-5 碰撞後只剩下 10510 永遠不會發生碰撞。
示例 2:
輸入: asteroids = [8, -8] 輸出: [] 解釋: 8-8 碰撞後,兩者都發生爆炸。
示例 3:
輸入: 
asteroids = [10, 2, -5]
輸出: [10]
解釋: 
2-5 發生碰撞後剩下 -510-5 發生碰撞後剩下 10
示例 4:

輸入: 
asteroids = [-2, -1, 1, 2]
輸出: [-2, -1, 1, 2]
解釋: 
-2-1 向左移動,而 12 向右移動。
由於移動方向相同的行星不會發生碰撞,所以最終沒有行星發生碰撞。

說明:

陣列 asteroids 的長度不超過 10000。
每一顆行星的大小都是非零整數,範圍是 [-1000, 1000] 。

解答

class Solution {
public:
    vector<int> asteroidCollision(vector<int>& asteroids) {
        stack<int> s; s.push(INT_MIN);
        for (auto n : asteroids) {
            if (n < 0) {
                while (s.top() > 0 && s.top() < -n)
                    s.pop
(); if (s.top() < 0) s.push(n); else if (s.top() == -n) s.pop(); } else s.push(n); } vector<int> res; while (s.size() != 1) { res.push_back(s.top()); s.pop(); } return {res.rbegin(), res.rend()}; } };