【剑指offer】行星碰撞-利于辅助栈并且判断碰撞条件

【剑指offer】行星碰撞-利于辅助栈并且判断碰撞条件_第1张图片
解题思路
通过题目描述可以了解到,只有当数组中正负数分界线左边为正数,右边为负数时,才会发生碰撞,当数组中全为负数或者全为正数时(即不存在分界线),或者分界线左侧为负数,右侧为正数,例如 [-2,-1,1,2]以上几种情况时,不可能发生碰撞。

用一个辅助栈
当当前元素与栈顶元素异号,且分界线左侧为正数,右侧为负数(此时当前元素应为负,栈内元素为正),判断栈顶元素和当前元素绝对值大小
1:当前元素绝对值<栈顶元素绝对值,栈顶元素不变,即此时当前元素爆炸;
2:当前元素绝对值>栈顶元素绝对值,栈顶元素爆炸,栈顶元素出栈;
3.当前元素绝对值=栈顶元素绝对值,两者都爆炸,栈顶元素出栈;
其他情况下,当前元素入栈;

class Solution {
     
    public int[] asteroidCollision(int[] asteroids) {
     
        int l=asteroids.length;
        Deque<Integer> stack=new LinkedList<>();//定义一个辅助栈
        int i=0;
        while(i<l){
     
//flag用于未进入循环情况下或者栈顶元素已经不可能大于当前元素的情况下,将当前元素入栈;
            boolean flag=false;
//异号并且栈不空时进入循环
            while(!stack.isEmpty()&&((asteroids[i]*stack.peek())<0)){
     
//当前元素绝对值小于栈顶元素绝对值,当前元素不入栈,跳出循环
                if(asteroids[i]<0&&Math.abs(stack.peek())>Math.abs(asteroids[i])){
     
                    flag=true;
                    break;
//当前元素绝对值大于栈顶元素绝对值,栈顶元素出栈,当前元素继续与新栈顶元素比较
                }else if(asteroids[i]<0&&Math.abs(stack.peek())<Math.abs(asteroids[i])){
     
                    stack.pop();
//当前元素绝对值等于栈顶元素绝对值,栈顶元素出栈,当前元素不入栈
                }else if(asteroids[i]<0&&Math.abs(stack.peek())==Math.abs(asteroids[i])){
     
                    stack.pop();
                    flag=true;
                    break;
                }else break;
//其他情况 当前元素入栈
            }
            if(!flag) stack.push(asteroids[i]);
            i++;
        }
//将栈中元素添加到数组中并返回
        int[] ret=new int[stack.size()];
        for(int j=stack.size()-1;j>=0;j--){
     
            ret[j]=stack.pop();
        }
        return ret;
    }
}

你可能感兴趣的:(剑指offer,Java,算法,数据结构)