LeetCode 735. 行星碰撞

发布于 2023-06-12 21:48:30 字数 2265 浏览 43 评论 0

给定一个整数数组 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 。

示例 4:

输入:asteroids = [-2,-1,1,2]
输出:[-2,-1,1,2]
解释:-2 和 -1 向左移动,而 1 和 2 向右移动。
由于移动方向相同的行星不会发生碰撞,所以最终没有行星发生碰撞。

提示:

2 <= asteroids.length <= 104
-1000 <= asteroids[i] <= 1000
asteroids[i] != 0

前置知识

思路

这道题思考难度不大。不过要想一次 bug free 也并不简单。我做这道题就错了好几次。

不妨从左到右进行模拟,这样只需要考虑其是否和左边的星球相撞即可,而不需要考虑右边(想想为什么?)。

如果当前星球的速度是正的。那么永远不会和前面的星球相撞,直接入栈。 否则,其有可能和前面的星球相撞。具体来说,如果前面的星球速度也是负数就不会相撞。反之如果前面星球速度为正,那么就一定会相撞。

而具体的相撞结果有三种(根据题目的例子也可以知道):

  1. 两个星球速度绝对值一样,那么两个星球都碎了。即出栈一次,不进栈。
  2. 负速度的绝对值大,那么就出栈一次,且进栈
  3. 正速度的绝对值大,那么就不出栈也不进栈。

唯一需要注意的是,如果发生碰撞后,当前的星球(速度为负的星球)速度绝对值更大,那么需要继续判断其是否会和前前一个星球碰撞。这提示我们使用 while 循环来进行。

思路其实还是蛮清晰的。只不过一开始追求代码简洁写了一些 bug。之后不得不认真考虑各种情况,写了一些“”丑代码“。

关键点

  • while break if else 的灵活使用

代码

  • 语言支持:Python3

Python3 Code:


class Solution:
    def asteroidCollision(self, asteroids):
        stack = []
        for asteroid in asteroids:
            if not stack or asteroid > 0:
                stack.append(asteroid)
            else:
                while stack and stack[-1] > 0:
                    if stack[-1] + asteroid > 0:
                        break
                    elif stack[-1] + asteroid < 0:
                        # 这种情况需要继续和前前星球继续判断是否碰撞
                        stack.pop()
                    else:
                        stack.pop()
                        break
                else:
                    stack.append(asteroid)

        return stack

复杂度分析

令 n 为数组长度。

  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(n)$

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

娇纵

暂无简介

文章
评论
25 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文