【栈】 735. 行星碰撞

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;


    }
}

你可能感兴趣的:(#,Leetcode,数据结构,算法,java)