题目浅析

  • 想查看原题可以点击题目链接

  • 简单地说,就是给一个整数数组,其中的正数代表向右运动的行星,负数代表向左运动的行星,规定行星会碰撞,且小的行星会破碎如果两个大小相等就都破碎。

思路分享

  • 这种只涉及最靠边的两个数值的情况,就适合用栈来辅助。

  • 首先判定碰撞,只有新元素为负数且栈有元素,以及栈顶为正数的情况会有碰撞。

  • 然后是模拟碰撞,就是看栈顶和新行星的情况,谁大留谁,一样大就都不留,一直循环到栈空或者栈顶值更大。

代码解答(强烈建议自行解答后再看)

  • 参考题解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution:
def asteroidCollision(self, asteroids: List[int]) -> List[int]:
stk = list()
for plantnet in asteroids:
# 下面是唯一的必定有碰撞的情况
continue_flag = False
while plantnet < 0 and stk and stk[-1] > 0:
# 这是向左的行星一直撞的情况
if -plantnet > stk[-1]:
stk.pop()
# 这是两个行星一起碎的情况
elif -plantnet == stk[-1]:
stk.pop()
continue_flag = True
break
# 这是新的行星直接碎了情况
else:
continue_flag = True
break

if continue_flag:
continue
stk.append(plantnet)
return stk