leetcode 735. 行星碰撞(C++、python)

本文介绍了一种模拟行星碰撞的算法,该算法使用栈来追踪不同方向移动的行星,并根据它们的大小判断是否会发生碰撞及碰撞后的结果。通过几个示例演示了如何应用此算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个整数数组 asteroids,表示在同一行的行星。

对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。

找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。

示例 1:

输入: 
asteroids = [5, 10, -5]
输出: [5, 10]
解释: 
10 和 -5 碰撞后只剩下 10。 5 和 10 永远不会发生碰撞。

示例 2:

输入: 
asteroids = [8, -8]
输出: []
解释: 
8 和 -8 碰撞后,两者都发生爆炸。

示例 3:

输入: 
asteroids = [10, 2, -5]
输出: [10]
解释: 
2 和 -5 发生碰撞后剩下 -5。10 和 -5 发生碰撞后剩下 10。

示例 4:

输入: 
asteroids = [-2, -1, 1, 2]
输出: [-2, -1, 1, 2]
解释: 
-2 和 -1 向左移动,而 1 和 2 向右移动。
由于移动方向相同的行星不会发生碰撞,所以最终没有行星发生碰撞。

说明:

  • 数组 asteroids 的长度不超过 10000
  • 每一颗行星的大小都是非零整数,范围是 [-1000, 1000] 。

C++

class Solution {
public:
    void help(stack<int>& tmp, int val)
    {
    	if(0==tmp.size())
    	{
    		tmp.push(val);
    		return;
    	}
    	if(val>0)
    	{
    		tmp.push(val);
    		return;
    	}
    	else
    	{
            if(tmp.top()<0)
            {
            	tmp.push(val);
            	return;
            }
            else
            {
            	int top=tmp.top();
            	if(0==val+top)
            	{
                    tmp.pop();
            		return;
            	}
            	else
            	{
                    int ans=val+top;
                    if(ans>0)
                    {
                        return;
                    }
                    else
                    {
                        tmp.pop();
            	        help(tmp,val);                        
                    }
            	}
            }
    	}
    }

    vector<int> asteroidCollision(vector<int>& asteroids) 
    {
        vector<int> res;
        int n=asteroids.size();
        if(0==n)
        {
        	return res;
        }
        stack<int> tmp;
        for(int i=0;i<n;i++)
        {
            help(tmp,asteroids[i]);
        }
        while(tmp.size())
        {
        	res.push_back(tmp.top());
        	tmp.pop();
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

python

class Solution:
    def help(self,tmp,val):
        if 0==len(tmp):
            tmp.append(val)
            return
        if val>0:
            tmp.append(val)
            return
        else:
            if tmp[-1]<0:
                tmp.append(val)
                return
            else:
                if 0==tmp[-1]+val:
                    del tmp[-1]
                    return
                else:
                    top=tmp[-1]
                    res=top+val
                    if res>0:
                        return
                    else:
                        del tmp[-1]
                        self.help(tmp,val)
                        
    
    def asteroidCollision(self, asteroids: List[int]) -> List[int]:
        n=len(asteroids)
        if 0==n:
            return res
        ans=[]
        for i in range(n):
            self.help(ans,asteroids[i])
        return ans
        
        
        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值