剑指 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
}

浙公网安备 33010602011771号