基本思路: 很简单。首先来一个辅助数组,最好是用栈,但是返回的结果不是数组么。所以直接用数组吧。 然后这么考虑: 从左往右遍历输入的数组,每遍历到一个值,若它能和辅助数组的最右边的行星发生碰撞,那么就计算一下看这个新来的行星是否会被撞爆,若被撞爆了,那么就遍历下一个。若没有那么就将辅助数组最右边的值弹出(表示最右边的行星被撞爆了),再重复进行上述操作,直到新来的行星被撞爆、或者辅助数组里面没有其他行星、或者新来的行星不会和辅助数组的最右边的行星发生碰撞为止。
最后直接返回辅助数组,即可。
class Solution {
public:
vector<int> asteroidCollision(vector<int>& asteroids) {
vector<int> Res;
for (int n : asteroids) {
while (true) {
// 若满足以下三个条件,直接将遍历到的n,push到辅助数组中。
if (Res.size() == 0 || Res.back() < 0 || n > 0) {
Res.push_back(n);
break;
}
// 若满足以下条件,说明新来的这个行星被撞爆了。
else if (abs(n) < Res.back()) {
break;
}
// 若满足以下条件,说明新来的这个行星和最靠右的行星都被撞爆了。
else if (abs(n) == Res.back()) {
Res.pop_back();
break;
}
// 若满足以下条件,说明新来的这个行星把最靠右的行星给撞爆了,所以不能跳出循环,直到这个新加进来的行星被撞爆,或者不会发生碰撞为止。
else {
Res.pop_back();
}
}
}
return Res;
}
};