735.行星碰撞
【LetMeFly】735.行星碰撞:vector优化
力扣题目链接:https://leetcode.cn/problems/asteroid-collision/
给定一个整数数组 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 。
提示:
2 <= asteroids.length <= 104
-1000 <= asteroids[i] <= 1000
asteroids[i] != 0
我觉得这道题题目非常有意思
方法一:用列表
从左向右遍历小行星asteroids,如果这个小行星方向向右,就添加到列表中。否则,不断从列表后面取出行星,和遍历到的行星进行碰撞,直到列表为空或遍历到的行星爆炸为止,若遍历到的行星没有爆炸,就添加到答案中。
最后把列表中的行星从前到后依次添加到答案中即可。
其实这道题用栈而不用列表的话回更容易了解。至于为什么用列表而不是用栈,是因为栈不能从栈底到栈顶遍历。若使用栈,则最终还需要用一个额外的临时栈来把栈中的元素reverse一遍
- 时间复杂度$O(n)$,其中$n$是小行星asteroids的个数
- 空间复杂度$O(n)$
AC代码
C++
1 |
|
方法一:直接用数组
方法二是方法一的优化。我们可以不适用列表,而是直接使用数组来代替列表。
数组中小于0的数是待返回的答案,大于0的数是原始列表中的数。
最终也不用再由列表添加到答案中了,很巧一方法。
- 时间复杂度$O(n)$,其中$n$是小行星asteroids的个数
- 空间复杂度$O(n)$
AC代码
C++
1 |
|
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125774687
735.行星碰撞
https://blog.letmefly.xyz/2022/07/13/LeetCode 0735.行星碰撞/