

这个问题可以用 单调栈 来解决。我们遍历数组,并使用一个栈来模拟小行星的碰撞过程:
思路:
- 使用栈存储小行星,栈顶元素是最右端的小行星。
- 遍历小行星数组:
- 若当前小行星向右移动(
正数),直接入栈。 - 若当前小行星向左移动(
负数),则可能会与栈中的小行星发生碰撞:- 只要栈顶是正数(向右移动)且其绝对值小于当前小行星,则栈顶小行星爆炸,继续比较下一栈顶。
- 如果栈顶与当前小行星相等,双方都爆炸,弹出栈顶,并终止当前小行星的入栈。
- 如果栈顶小行星较大,当前小行星爆炸,终止循环。
- 若当前小行星向右移动(
- 最终栈中的小行星即为剩余的小行星。
代码实现:
from typing import List
def asteroidCollision(asteroids: List[int]) -> List[int]:
stack = []
for asteroid in asteroids:
# 当前小行星是否爆炸的标志
alive = True
while stack and asteroid < 0 < stack[-1]: # 发生碰撞的条件
if abs(stack[-1]) < abs(asteroid): # 栈顶小行星小,爆炸
stack.pop()
continue
elif abs(stack[-1]) == abs(asteroid): # 质量相等,双方爆炸
stack.pop()
alive = False # 当前小行星爆炸
break
if alive:
stack.append(asteroid)
return stack
# 测试
print(asteroidCollision([5, 10, -5])) # [5, 10]
print(asteroidCollision([8, -8])) # []
print(asteroidCollision([10, 2, -5])) # [10]
print(asteroidCollision([-2, -1, 1, 2])) # [-2, -1, 1, 2]
复杂度分析:
- 时间复杂度:O(n),每个小行星最多入栈出栈一次。
- 空间复杂度:O(n),最坏情况下所有小行星都存入栈。
这样,我们就能高效地模拟小行星碰撞过程! 🚀
1021

被折叠的 条评论
为什么被折叠?



