735. 行星碰撞
解题思路
-
如果数组元素大于0 说明向右移动 那么不管 左边元素是不是大于0 都不会碰撞
-
如果数组元素小于0 说明想左边移动 那么判断左边元素 如果左边元素大于0 碰撞
-
那么遍历数组
-
当前元素大于0 直接入栈
-
如果当前元素小于0 判断栈顶元素是不是大于0 如果大于0 直接出栈
-
判断存活的元素
-
如果栈顶元素和当前元素的绝对值相等 全部销毁
-
如果栈顶元素大于当前元素的绝对值 当前元素销毁
-
如果栈顶元素小于当前元素绝对值 栈顶元素出栈 然后还要判断下一个栈顶元素
class Solution {public int[] asteroidCollision(int[] asteroids) {// 创建一个栈Stack<Integer> stack = new Stack<>();// 如果数组元素大于0 说明向右移动 那么不管 左边元素是不是大于0 都不会碰撞// 如果数组元素小于0 说明想左边移动 那么判断左边元素 如果左边元素大于0 碰撞// 那么遍历数组 // 当前元素大于0 直接入栈// 如果当前元素小于0 判断栈顶元素是不是大于0 如果大于0 直接出栈// 判断存活的元素// 如果栈顶元素和当前元素的绝对值相等 全部销毁// 如果栈顶元素大于当前元素的绝对值 当前元素销毁// 如果栈顶元素小于当前元素绝对值 栈顶元素出栈 然后还要判断下一个栈顶元素for(int num:asteroids){// 大于0 直接入栈if(num >0){stack.push(num);}else{boolean alive = true;// 当前元素设置存活 并且栈不是空的 栈顶元素大于0// 循环判断栈顶元素while(alive && !stack.isEmpty() && stack.peek() > 0){// 比较绝对值大小alive = stack.peek() < Math.abs(num);// 栈顶元素 出栈if(stack.peek() <= Math.abs(num)){stack.pop();}}if(alive){// 如果元素还存活 将元素入栈stack.push(num);}}}// 将栈中元素写入数组int[] ans = new int[stack.size()];int i = ans.length - 1;;while(!stack.isEmpty() && i >= 0){ans[i--] = stack.peek();stack.pop();}return ans;}
}