735. 小行星碰撞 (C++) 贪心算法 弱智版 击败5%的人

给定一个整数数组 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;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值