行星碰撞
难度:
标签:
题目描述
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)
代码细节讲解
🦆
如何处理数组中连续出现多个向左移动的小行星(负值)的情况?
▷🦆
在比较栈顶小行星和当前小行星的大小时,如何确保所有相关的小行星都已经考虑并处理完毕?
▷🦆
为什么在处理过程中,一旦确定当前向左的小行星比栈顶向右的小行星大,就将栈顶小行星弹出而不是直接将当前小行星入栈?
▷