leetcode-735:行星碰撞

简介: leetcode-735:行星碰撞

题目

题目连接

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

解题

方法一:栈模拟

class Solution {
public:
    vector<int> asteroidCollision(vector<int>& asteroids) {
        deque<int> st;
        for(int num:asteroids){
            st.push_back(num);
            while(st.size()>=2){
                int last=st[st.size()-1];
                int pre=st[st.size()-2];
                if(last*pre>0||pre<0||last>0) break;
                if(abs(last)==abs(pre)){
                    st.pop_back();
                    st.pop_back();
                }else if(abs(pre)>abs(last)){
                    st.pop_back();
                }
                else{
                    st.pop_back();
                    st.pop_back();
                    st.push_back(last);
                }
            } 
        }
        return vector<int>(st.begin(),st.end());
    }
};

方法二:数组模拟栈

class Solution {
public:
    vector<int> asteroidCollision(vector<int>& asteroids) {
        int l=asteroids.size();
        vector<int> arr(l);
        int p=-1;
        for(int a:asteroids){
            bool ok=true;
            while(p!=-1&&ok&&a<0&&arr[p]>0){
                ok=-a>arr[p];
                if(-a>=arr[p]){
                    p--;
                }
            }
            if(ok) arr[++p]=a;
        }
        return vector<int>(arr.begin(),arr.begin()+p+1);
    }
};
相关文章
|
12月前
|
算法 测试技术 C++
C++算法:美丽塔O(n)解法单调栈
C++算法:美丽塔O(n)解法单调栈
|
4月前
|
存储 算法 测试技术
力扣经典150题第五十题:用最少数量的箭引爆气球
力扣经典150题第五十题:用最少数量的箭引爆气球
20 0
|
5月前
leetcode-419:甲板上的战舰
leetcode-419:甲板上的战舰
35 0
|
5月前
|
机器学习/深度学习 存储
leetcode-1036:逃离大迷宫
leetcode-1036:逃离大迷宫
31 0
|
机器学习/深度学习
剑指offer 13. 剪绳子
剑指offer 13. 剪绳子
69 0
LeetCode每日一题(11)——太平洋大西洋水流问题(递归,深度优先遍历实例)
大西洋太平洋水流问题 1.题目 2.示例 3.思路 理解题目 解题思路 4.代码
133 0
LeetCode每日一题(11)——太平洋大西洋水流问题(递归,深度优先遍历实例)
LeetCode每日一题——799. 香槟塔
我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香槟。
126 0
LeetCode每日一题——799. 香槟塔
|
定位技术
宝岛探险(求岛屿大小,染色法) 宽搜 深搜
宝岛探险(求岛屿大小,染色法) 宽搜 深搜
宝岛探险(求岛屿大小,染色法) 宽搜 深搜
|
机器学习/深度学习 算法 Windows
LeetCode 452. 用最少数量的箭引爆气球(贪心算法)
LeetCode 452. 用最少数量的箭引爆气球(贪心算法)
103 0
LeetCode每日一题——735. 行星碰撞
给定一个整数数组 asteroids,表示在同一行的行星。
122 0