前言:
通过leetcode记录自己每天坚持刷题,以此监督自己的学习。不能放假了就懈怠😁
题目简介
给定一个整数数组 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