python-leetcode-小行星碰撞

735. 小行星碰撞 - 力扣(LeetCode)

这个问题可以用 单调栈 来解决。我们遍历数组,并使用一个栈来模拟小行星的碰撞过程:

思路:

  1. 使用栈存储小行星,栈顶元素是最右端的小行星。
  2. 遍历小行星数组
    • 若当前小行星向右移动(正数),直接入栈。
    • 若当前小行星向左移动(负数),则可能会与栈中的小行星发生碰撞:
      • 只要栈顶是正数(向右移动)且其绝对值小于当前小行星,则栈顶小行星爆炸,继续比较下一栈顶。
      • 如果栈顶与当前小行星相等,双方都爆炸,弹出栈顶,并终止当前小行星的入栈。
      • 如果栈顶小行星较大,当前小行星爆炸,终止循环。
  3. 最终栈中的小行星即为剩余的小行星

代码实现:

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),最坏情况下所有小行星都存入栈。

这样,我们就能高效地模拟小行星碰撞过程! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值