LeetCode 735. 行星碰撞
描述
给定一个整数数组 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 <= 104
-1000 <= asteroids[i] <= 1000
asteroids[i] != 0
题解
class Solution {
public int[] asteroidCollision(int[] asteroids) {
// 栈
Stack<Integer> stack = new Stack<>();
// 遍历行星
for(int i = 0;i < asteroids.length;i++){
// 当前行星
int num = asteroids[i];
// 正向直接添加
if(num>0){
stack.push(num);
} else{
// 负向
boolean flag = true;
// 当 栈不为空 栈顶元素大于0
while(flag && !stack.isEmpty() && stack.peek() > 0 ){
// 如果 栈顶行星小于当前行星的绝对值 栈顶行星爆炸 当前行星存在
flag = stack.peek() < Math.abs(num);
if(stack.peek() <= Math.abs(num)){
// 栈顶行星爆炸
stack.pop();
}
}
if(flag){
// 当前行星不会爆炸
stack.push(num);
}
}
}
// 结果
int res[] = new int[stack.size()];
int i = stack.size()-1 ;
while(!stack.isEmpty()){
res[i--] = stack.pop();
}
return res;
}
}