【栈】B031
给定一个整数数组 asteroids,表示在同一行的行星。
对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。
找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。
示例 1:
输入:
asteroids = [5, 10, -5]
输出: [5, 10]
解释:
10 和 -5 碰撞后只剩下 10。 5 和 10 永远不会发生碰撞。示例 2:
输入:
asteroids = [8, -8]
输出: []
解释:
8 和 -8 碰撞后,两者都发生爆炸。
说明:
数组 asteroids 的长度不超过 10000
每一颗行星的大小都是非零整数,范围是 [-1000, 1000]
方法一:
思路
这题核心逻辑是需要一直模拟碰撞过程,而不是逐个添加;
class Solution {
public:vector<int> asteroidCollision(vector<int>& A) {int n=A.size();stack<int> st;for (int w : A) {if (w < 0) {while (!st.empty() && st.top()>0 && st.top()<-w) st.pop();if (!st.empty() && st.top()+w==0) st.pop();else if (st.empty() || st.top()<0) st.push(w);} else {st.push(w);}}vector<int> ans(st.size());int i=st.size()-1;while (!st.empty()) ans[i--]=st.top(), st.pop();return ans;}
};
复杂度分析
- Time: O ( n ) O(n) O(n),
- Space: O ( n ) O(n) O(n)
更多推荐
【栈】B031
发布评论