剑指 Offer II 037. 小行星碰撞

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

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值