剑指 Offer II 037. 小行星碰撞
题目:
给定一个整数数组 asteroids,表示在同一行的小行星。
对于数组中的每一个元素,其绝对值表示小行星的大小,正负表示小行星的移动方向(正表示向右移动,负表示向左移动)。每一颗小行星以相同的速度移动。
找出碰撞后剩下的所有小行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。
解题思路:
首先这题需要利用栈来存储最后留下的小行星。
我们分情况讨论,(我们设置一个栈叫nums)
1.什么时候写入栈
当nums为空时 || 当前行星>0 ||nums的栈顶元素<0
以上这三种情况,我们需要将当前元素写入栈。
2.什么时候消除
栈不为空 && 当前元素小于0 && 栈顶元素大于0
1)此时需要判断当前元素的相反数是否大于栈顶元素,如果大于则消除栈顶元素且继续判断下一个栈顶元素是否能被消除。
2)特殊情况:如果当前元素的相反数与栈顶元素一样大,那么将栈顶元素消除,并且不需要对下一个栈顶元素进行判断。程序直接判断下一个元素。
class Solution {
public:
vector<int> asteroidCollision(vector<int>& asteroids) {
stack<int> nums;
for(int p:asteroids){
while(!nums.empty() && nums.top()>0 && nums.top()<-p){
nums.pop();
}
if(nums.empty() || p>0 || nums.top()<0){
nums.push(p);
}
else if(!nums.empty() && p<0 && nums.top()==-p){
nums.pop();
}
}
int s=nums.size();
vector<int> res(s,0);
for(int i=s-1;i>-1;i--){
res[i]=nums.top();
nums.pop();
}
return res;
}
};