问题描述:
- 给定一个整数数组
asteroids
,表示在同一行的小行星。
- 对于数组中的每一个元素,其绝对值表示小行星的大小,正负表示小行星的移动方向(正表示向右移动,负表示向左移动)。每一颗小行星以相同的速度移动。
- 找出碰撞后剩下的所有小行星。
- 碰撞规则:
- 两个行星相互碰撞,较小的行星会爆炸。
- 如果两颗行星大小相同,则两颗行星都会爆炸。
- 两颗移动方向相同的行星,永远不会发生碰撞。
核心思路:
- 模拟题,用栈来保存遇到的值,关键在于分情况讨论:
- 如果当前遇到的是负值,就需要与栈顶元素(而且栈顶元素需要是正数星球)比较,得出碰撞结果后查看剩下的是栈顶还是负数星球。
- 因此用一个布尔值
alive
来标记当前的负数星球是否仍存活。
- 用数组来模拟栈,可以直接作为结果返回。
代码实现:
class Solution
{
public:
vector<int> asteroidCollision(vector<int>& asteroids)
{
vector<int> stk;
for(int num : asteroids)
{
bool alive = true;
while(alive and num < 0 and !stk.empty() and stk.back() > 0)
{
if(stk.back() >= -num)
alive = false;
if(stk.back() <= -num)
stk.pop_back();
}
if(alive)
stk.emplace_back(num);
}
return stk;
}
};