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

每日一题735. 行星碰撞

[LeetCode] Asteroid Collision 行星碰撞

Java每日一题——>剑指 Offer II 037. 小行星碰撞

Java每日一题——>剑指 Offer II 037. 小行星碰撞