给定一个整数数组 asteroids
,表示在同一行的小行星。
对于数组中的每一个元素,其绝对值表示小行星的大小,正负表示小行星的移动方向(正表示向右移动,负表示向左移动)。每一颗小行星以相同的速度移动。
找出碰撞后剩下的所有小行星。碰撞规则:两个小行星相互碰撞,较小的小行星会爆炸。如果两颗小行星大小相同,则两颗小行星都会爆炸。两颗移动方向相同的小行星,永远不会发生碰撞。
直接看代码:
class Solution {
public:
vector<int> asteroidCollision(vector<int>& asteroids) {
while (1){
int pre=0;
int next=1;
while (next<asteroids.size()){
//处理会相撞的情况(方向不一致)
if(asteroids[pre]*asteroids[next]<0){
//如果前面的向左移动 则后面的向右不会碰撞
if(asteroids[pre]<0){
pre=next;
next++;
continue;
}
//会碰撞的情况
if(abs(asteroids[pre])< abs(asteroids[next])){
asteroids[pre]=0;
} else if (abs(asteroids[pre])>abs(asteroids[next])){
asteroids[next]=0;
} else
{
asteroids[pre]=0;
asteroids[next]=0;
}
//每碰撞一次都重新开始,查看碰撞后的新情况是否满足碰撞条件
break;
}
//不碰撞的情况 控制指针移动
if(asteroids[pre]==0){
pre=next;
next++;
} else if(asteroids[next]==0){
next++;
} else{
pre=next;
next++;
}
}
if(next>=asteroids.size()){
break;
}
}
vector<int>res;
for (int i = 0; i < asteroids.size(); ++i) {
if(asteroids.at(i)!=0){
res.push_back(asteroids.at(i));
}
}
return res;
}
};