题目
735. 行星碰撞
https://leetcode-cn.com/problems/asteroid-collision/
题解
栈的思想解决
- 如果栈为空,那么直接入栈。
- 当前的遍历到的数值大于0,那么直接入栈。
- 如果为负数:
- 栈顶为负数,入栈
- 栈顶为正数,判断和当前数字的绝对值比较,绝对值大,那么整数出栈,且判断栈是否为空,为空就入栈,且结束。
- 栈顶为正数,且比当前数字的绝对值小,那么正整数出栈,且判断栈是否为空,为空就入栈,且结束。
public int[] asteroidCollision(int[] asteroids) {
if (asteroids == null || asteroids.length == 0) {
return asteroids;
}
Stack<Integer> stack = new Stack<>();
for (int i = 0, len = asteroids.length; i < len; i++) {
if (stack.isEmpty() || asteroids[i] > 0) {
stack.push(asteroids[i]);
continue;
}
int temp = asteroids[i];
while (true) {
if (stack.peek() < 0) {
stack.push(asteroids[i]);
break;
} else if (Math.abs(temp) == stack.peek()) {
stack.pop();
break;
} else if (Math.abs(temp) > stack.peek()) {
stack.pop();
if (stack.isEmpty()) {
stack.push(temp);
break;
}
} else if (Math.abs(temp) < stack.peek()){
break;
}
}
}
int[] ans = new int[stack.size()];
for (int i = stack.size() - 1; i >= 0; i--) {
ans[i] = stack.pop();
}
return ans;
}