暑假leetcode每日一题打卡-第六天-行星碰撞(middle)

前言:

通过leetcode记录自己每天坚持刷题,以此监督自己的学习。不能放假了就懈怠😁

题目简介

题目传送地Leetcode:735.行星碰撞

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

解析

讲道理我认为leetcode一直以为多有个坏毛病就是语文不及格题目阐述太拉跨,示例也没有代表性,
比如:

输入asteroids = [-5,10,2,-5,1]
输出[-5,10,1]

这样其实就一目了然了,这个题还是很容易的,直接用数组模拟一个栈,然后遍历数组,里面存放能够存活的行星。起初先存放右行的

代码class Solution:

   def asteroidCollision(self, asteroids: List[int]) -> List[int]:
        stack=[]
        for star in asteroids:
            if not stack or star>0:
                stack.append(star)       #右行的以及左行已经安全的入栈
            else:        #如果是左行的就要与栈中右行的进行撞击
                remain=True   # 维护存在的状态判断跳出循环后时候能存活
                while stack and stack[-1]>0:   #当碰到栈中左行(前一个安全了,他自然也就安全)的或者空栈即可跳出
                    if stack[-1]>-star:  #左行的碰上更大的,败北      
                        remain=False
                        break
                    elif stack[-1]==-star:  #双方均败北
                        remain=False
                        stack.pop()
                        break
                    else:       #接着飞,直至遇到没有逆行的行星
                        stack.pop()
                if remain==True:        # 能存活
                    stack.append(star)
        return stack
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值