Toasobi
行星碰撞(栈模拟)
本文最后更新于2023年09月21日,已超过471天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
- 题目
给定一个整数数组 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 。
为了方便,我们令 asteroids 为 ats。
由于碰撞抵消总是从相邻行星之间发生,我们可以使用「栈」来模拟该过程。
从前往后处理所有的 ats[i]ats[i]ats[i],使用栈存储当前未被抵消的行星,当栈顶元素方向往右,当前 ats[i]ats[i]ats[i] 方向往左时,会发生抵消操作,抵消过程根据规则进行即可
代码:
class Solution {
public int[] asteroidCollision(int[] ats) {
Deque<Integer> d = new ArrayDeque<>();
for (int t : ats) {
boolean ok = true; //该行星是否在碰撞中存活
while (ok && !d.isEmpty() && d.peekLast() > 0 && t < 0) {
int a = d.peekLast(), b = -t;
if (a <= b) d.pollLast();
if (a >= b) ok = false;
}
if (ok) d.addLast(t);
}
int sz = d.size();
int[] ans = new int[sz];
while (!d.isEmpty()) ans[--sz] = d.pollLast();
return ans;
}
}