给定一个整数数组 asteroids,表示在同一行的行星。
对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。
找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。
链接:https://leetcode-cn.com/problems/asteroid-collision
首先,看到这样的数组,应该先想能不能排序,发现排序对这道题没有意义,就放弃排序,换思路。这道题的重点在要拿出前一个值和现在的值作比较,那么自然而然地想到栈的做法。
思考的过程是:
1.若当前asteroids值为正,那么直接进temp,因为它一定不会和前面的行星发生碰撞。
2.若当前的asteroids值为负,那么就要考虑temp中最后一个值与他的比较了,分为五种情况
① temp是空的,那么把当前值放入temp即可,break出循环
② temp非空,但是最后的值为负数,那么也放入temp即可,因为不会相撞,break出循环
③ temp非空,但是最后的值为正数,且绝对值大于当前asteroids值,那么相撞之后当前asteroids值消失,break出循环
④ temp非空,但是最后的值为正数,且绝对值小于当前asteroids值,那么相撞之后temp的最后值消失,继续循环
⑤ temp非空,但是最后的值为正数,且绝对值等于当前asteroids值,那么相撞之后当前asteroids值消失temp的最后的值也消失,break出循环
class Solution:
def asteroidCollision(self, asteroids: List[int]) -> List[int]:
temp = [] # vector
count = -1 # 指针,作vector
for i in range(len(asteroids)):
if asteroids[i] > 0:
temp.append(asteroids[i])
count += 1
else:
if count < 0 or temp[count] < 0:
temp.append(asteroids[i])
count += 1
continue
while (count > -1 and temp[count] > 0):
if asteroids[i] + temp[count] < 0:
del temp[count]
count -= 1
if count < 0 or temp[count] < 0:
temp.append(asteroids[i])
count += 1
break
elif asteroids[i] + temp[count] > 0:
break
else:
del temp[count]
count -= 1
break
return temp