leetcode
leetcode 2951 ~ 3000
行星碰撞

行星碰撞

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 31 ms, 内存: 17.0 MB


/*
 * 题目思路:
 * 使用栈来模拟小行星碰撞的过程,但使用Java Stream来处理结果输出。
 * 1. 遍历小行星数组。
 * 2. 对于每个小行星,如果栈为空,或者当前小行星向右移动(正数),则直接入栈。
 * 3. 如果当前小行星向左移动(负数),则需要判断栈顶小行星是否会发生碰撞:
 *    - 如果栈顶小行星向右移动(正数),则比较两者大小,较小的爆炸,较大的继续与下一个小行星比较。
 *    - 如果相等,则两者都爆炸,继续下一个小行星。
 *    - 如果栈顶小行星向左移动(负数),则直接入栈。
 */
import java.util.*;
import java.util.stream.*;

public class AsteroidCollisionStream {
    public int[] asteroidCollision(int[] asteroids) {
        Stack<Integer> stack = new Stack<>();
        for (int asteroid : asteroids) {
            if (asteroid > 0) {
                stack.push(asteroid);
            } else {
                while (!stack.isEmpty() && stack.peek() > 0 && stack.peek() < Math.abs(asteroid)) {
                    stack.pop();
                }
                if (stack.isEmpty() || stack.peek() < 0) {
                    stack.push(asteroid);
                } else if (stack.peek() == Math.abs(asteroid)) {
                    stack.pop();
                }
            }
        }
        return stack.stream().mapToInt(i -> i).toArray();
    }
}

解释

方法:

该题解利用栈的数据结构来模拟小行星的碰撞过程。遍历整个小行星数组,对于每一个小行星,如果当前小行星向左移动(负值),并且栈顶元素(表示当前未被销毁的小行星)向右移动(正值),则根据大小比较结果决定是否爆炸。如果栈顶小行星比当前小行星小或等于,栈顶小行星会被销毁(出栈)。如果当前小行星更大或者栈为空(或栈顶元素向左移动),则当前小行星入栈。最终栈中剩余的元素即为碰撞后剩下的小行星。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
如何处理数组中连续出现多个向左移动的小行星(负值)的情况?
在处理向左移动的小行星时,如果栈顶小行星向右移动,会进行碰撞比较。如果栈为空或栈顶小行星也向左移动,则当前小行星可以直接入栈。因此,如果数组中连续出现多个向左移动的小行星,它们不会相互碰撞,而会依次入栈。这些小行星只会与先前栈中向右移动的小行星发生碰撞比较。
🦆
在比较栈顶小行星和当前小行星的大小时,如何确保所有相关的小行星都已经考虑并处理完毕?
算法通过使用while循环持续比较栈顶小行星和当前小行星,直到没有更多的碰撞发生(即栈顶小行星不再向右或当前小行星不再向左),或者当前小行星已完全被销毁。这种循环确保了每次碰撞后,都会重新检查新的栈顶小行星与当前小行星的关系,从而保证所有相关的小行星在进入下一步之前都已被适当处理。
🦆
为什么在处理过程中,一旦确定当前向左的小行星比栈顶向右的小行星大,就将栈顶小行星弹出而不是直接将当前小行星入栈?
因为栈顶的小行星向右,而当前小行星向左,它们会发生碰撞。如果当前小行星的绝对值大于栈顶小行星,则栈顶小行星会被销毁。弹出栈顶小行星后,需要继续检查新的栈顶小行星是否也会与当前小行星发生碰撞并可能被销毁。只有当没有更多的碰撞发生时(即当前小行星不再与新的栈顶小行星碰撞,或栈为空),当前小行星才会入栈。这确保了所有的碰撞都被处理,避免了遗漏任何碰撞情况。

相关问题