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);
    }
};
相关文章
|
算法 测试技术 C++
C++算法:美丽塔O(n)解法单调栈
C++算法:美丽塔O(n)解法单调栈
|
2月前
lanqiao OJ 131 生命之树
lanqiao OJ 131 生命之树
32 0
|
2月前
lanqiao oj 131 生命之树
lanqiao oj 131 生命之树
27 0
|
7月前
leetcode-419:甲板上的战舰
leetcode-419:甲板上的战舰
39 0
|
7月前
|
机器学习/深度学习 存储
leetcode-1036:逃离大迷宫
leetcode-1036:逃离大迷宫
33 0
|
C++
【LeetCode343】剪绳子(动态规划)
(1)确定状态 dp[i]是将正整数i拆成2个及其以上的正整数后,求所有数的乘积值。
141 0
【LeetCode343】剪绳子(动态规划)
|
机器学习/深度学习
剑指offer 13. 剪绳子
剑指offer 13. 剪绳子
73 0
|
存储 算法 索引
LeetCode——824. 山羊拉丁文
LeetCode——824. 山羊拉丁文
87 0
LeetCode——824. 山羊拉丁文
|
机器学习/深度学习
力扣-1036. 逃离大迷宫
在一个 106 x 106 的网格中,每个网格上方格的坐标为 (x, y) 。 现在从源方格 source = [sx, sy] 开始出发,意图赶往目标方格 target = [tx, ty] 。数组 blocked 是封锁的方格列表,其中每个 blocked[i] = [xi, yi] 表示坐标为 (xi, yi) 的方格是禁止通行的。 每次移动,都可以走到网格中在四个方向上相邻的方格,只要该方格 不 在给出的封锁列表 blocked 上。同时,不允许走出网格。 只有在可以通过一系列的移动从源方格 source 到达目标方格 target 时才返回 true。否则,返回 false。
101 0
力扣-1036. 逃离大迷宫