栈-N735-行星碰撞

题目

  • 概述:给定一个数组,代表移动速度相同的行星,数组元素的绝对值表示行星的大小,正负代表行星的移动方向(左负右正),移动方向不同的行星会发生碰撞,小的行星遇到大的行星会爆炸,大小相同的行星相遇都会爆炸,问最后剩下哪些行星

  • 输入:行星数组,长度范围[0, 10000]

  • 输入子项:非零整数,大小范围[-1000, 1000]

  • 输出:碰撞后最终剩下的行星数组

  • 出处:https://leetcode-cn.com/problems/asteroid-collision/

思路

  • 由于需要记录之前的行星信息用来判断是否会发生碰撞,所以考虑用栈实现

  • 遍历行星数组:

    1. 正数 => 直接入栈
    2. 负数:
      1. 栈为空 => 直接入栈
      2. 栈顶元素为负数 => 直接入栈
      3. 栈顶元素为正数:
        1. 当前元素绝对值 == 栈顶元素绝对值 => 栈顶元素出栈
        2. 当前元素绝对值 > 栈顶元素绝对值 => 栈顶元素出栈,重复
  • 栈中所剩元素即为碰撞后最终剩下的行星

代码

class Solution {
    public int[] asteroidCollision(int[] asteroids) {
        LinkedList stack = new LinkedList<>();
        for (int i = 0; i < asteroids.length; ++i) {
            if (asteroids[i] > 0) {
                stack.push(asteroids[i]);
            } else {
                while (true) {
                    if (stack.isEmpty() || stack.peek() < 0) {
                        stack.push(asteroids[i]);
                        break;
                    } else {
                        if (asteroids[i] + stack.peek() == 0) {
                            stack.pop();
                            break;
                        } else if (asteroids[i] + stack.peek() < 0) {
                            stack.pop();
                        } else {
                            break;
                        }
                    }
                }
            }
        }
        
        int[] result = new int[stack.size()];
        for (int i = stack.size() - 1; i >= 0; --i) {
            result[i] = stack.pop();
        }
        return result;
    }
}

你可能感兴趣的:(栈-N735-行星碰撞)