乐趣区

关于后端:735-行星碰撞-简单栈模拟运用题

题目形容

这是 LeetCode 上的 735. 行星碰撞 ,难度为 中等

Tag :「DFS」、「模仿」、「哈希表」

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

提醒:

  • $2 <= asteroids.length <= 10^4$
  • $-1000 <= asteroids[i] <= 1000$
  • $asteroids[i] != 0$

模仿 + 栈

为了不便,咱们令 asteroidsats

因为碰撞对消总是从相邻行星之间产生,咱们能够应用「栈」来模仿该过程。

从前往后解决所有的 $ats[i]$,应用栈存储以后未被对消的行星,当栈顶元素方向往右,以后 $ats[i]$ 方向往左时,会产生对消操作,对消过程依据规定进行即可。

Java 代码:

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 = Math.abs(d.peekLast()), b = Math.abs(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;
    }
}

TypeScript 代码:

function asteroidCollision(ats: number[]): number[] {const stk: number[] = new Array<number>()
    for (const t of ats) {
        let ok: boolean = true
        while (ok && stk.length > 0 && stk[stk.length - 1] > 0 && t < 0) {const a = Math.abs(stk[stk.length - 1]), b = Math.abs(t);
            if (a <= b) stk.pop()
            if (a >= b) ok = false
        }
        if (ok) stk.push(t)
    }
    return stk
};

Python3 代码:

class Solution:
    def asteroidCollision(self, ats: List[int]) -> List[int]:
        stk = []
        for t in ats:
            ok = True
            while ok and stk and stk[-1] > 0 and t < 0:
                a, b = abs(stk[-1]), abs(t)
                if a <= b:
                    stk.pop(-1)
                if a >= b:
                    ok = False
            if ok:
                stk.append(t)
        return stk
  • 工夫复杂度:$O(n)$
  • 空间复杂度:$O(n)$

最初

这是咱们「刷穿 LeetCode」系列文章的第 No.735 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,局部是有锁题,咱们将先把所有不带锁的题目刷完。

在这个系列文章外面,除了解说解题思路以外,还会尽可能给出最为简洁的代码。如果波及通解还会相应的代码模板。

为了不便各位同学可能电脑上进行调试和提交代码,我建设了相干的仓库:https://github.com/SharingSou…。

在仓库地址里,你能够看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其余优选题解。

更多更全更热门的「口试 / 面试」相干材料可拜访排版精美的 合集新基地 🎉🎉

本文由 mdnice 多平台公布

退出移动版