LeetCode 0735.行星碰撞:两种方法(方法二是方法一的优化)
Posted Tisfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0735.行星碰撞:两种方法(方法二是方法一的优化)相关的知识,希望对你有一定的参考价值。
【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 ) O(n) O(n),其中 n n n是小行星asteroids的个数
- 空间复杂度 O ( n ) O(n) O(n)
AC代码
C++
class Solution
public:
vector<int> asteroidCollision(vector<int>& asteroids)
vector<int> ans;
list<int> lr; // From left to right
for (int &t : asteroids)
if (t > 0)
lr.push_back(t);
else
bool destroyed = false;
while (lr.size())
int Mlr = lr.back();
if (Mlr < abs(t))
lr.pop_back();
else if (Mlr == abs(t))
lr.pop_back();
destroyed = true;
break;
else
destroyed = true;
break;
if (!destroyed)
ans.push_back(t);
for (int &t : lr)
ans.push_back(t);
return ans;
;
方法一:直接用数组
方法二是方法一的优化。我们可以不适用列表,而是直接使用数组来代替列表。
数组中小于0的数是待返回的答案,大于0的数是原始列表中的数。
最终也不用再由列表添加到答案中了,很巧一方法。
- 时间复杂度 O ( n ) O(n) O(n),其中 n n n是小行星asteroids的个数
- 空间复杂度 O ( n ) O(n) O(n)
AC代码
C++
class Solution
public:
vector<int> asteroidCollision(vector<int>& asteroids)
vector<int> ans; // From left to right
for (int &t : asteroids)
if (t > 0)
ans.push_back(t);
else
bool alive = true;
while (alive && ans.size() && ans.back() > 0)
alive = ans.back() < -t;
if (ans.back() <= -t)
ans.pop_back();
if (alive)
ans.push_back(t);
return ans;
;
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125774687
以上是关于LeetCode 0735.行星碰撞:两种方法(方法二是方法一的优化)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 735 行星碰撞[栈 模拟] HERODING的LeetCode之路
[LeetCode] 735. Asteroid Collision
[LeetCode] Asteroid Collision 行星碰撞