剑指 Offer II 037. 小行星碰撞;栈模拟

题目
给定一个整数数组 asteroids,表示在同一行的小行星。

对于数组中的每一个元素,其绝对值表示小行星的大小,正负表示小行星的移动方向(正表示向右移动,负表示向左移动)。每一颗小行星以相同的速度移动。

找出碰撞后剩下的所有小行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。

c++栈代码
class Solution {
public:
    vector<int> asteroidCollision(vector<int>& asteroids) {


        stack<int> sta;

        for(int as:asteroids)//遍历vector
        {                                                     //WHILE判断碰撞,
           while(!sta.empty() && sta.top()>0 && sta.top()<-as)//当栈非空,栈中行星一直向右时,
           {                                                  //判断是否比-as小,是则说明新的
                                                              //行星向左并且比原来的TOP大,POP
               sta.pop();
           }

           if(!sta.empty() && sta.top() == -as &&as<0)//当TOP和新行星一样大,POP
           {
               sta.pop();
           }
           else if( as > 0 || sta.empty() || sta.top() < 0)//经过前面两轮,如果栈为空,或者新as向右,或者TOP向左,都不会发生碰撞,push
           {
               sta.push(as);
           }
        }
        int size = sta.size();
        vector<int> ans(size, 0);//stack转vector(?)
        for (int i = 0; i < size; ++i) {
            ans[size - 1 - i] = sta.top();//因为栈FILO,所以倒序插入vector
            sta.pop();
        }
        return ans;
    }
};

golang模拟栈代码
func asteroidCollision(asteroids []int)(ans []int) {


   for _,aster :=range asteroids{
       alive := true
       for alive && aster <0 && len(ans)>0 && ans[len(ans)-1] >0{
           alive = ans[len(ans)-1] < -aster
           if -aster >= ans[len(ans)-1]{
               ans = ans[:len(ans)-1]
           }
       }
       if alive{
           ans = append(ans,aster)
       }
   }

    return 
}
posted @ 2021-11-15 00:26  Akisumu  阅读(37)  评论(0)    收藏  举报