TypechoJoeTheme

Toasobi的博客

行星碰撞(栈模拟)

本文最后更新于2023年09月21日,已超过363天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
  • 题目

给定一个整数数组 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;
    }
}
朗读
赞(0)
评论 (0)