⭐北邮复试刷题LCR 037. 行星碰撞__栈 (力扣119经典题变种挑战)

LCR 037. 行星碰撞

给定一个整数数组 asteroids,表示在同一行的小行星。

对于数组中的每一个元素,其绝对值表示小行星的大小,正负表示小行星的移动方向(正表示向右移动,负表示向左移动)。每一颗小行星以相同的速度移动。

找出碰撞后剩下的所有小行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。

示例 1:
输入:asteroids = [5,10,-5]
输出:[5,10]
解释:10 和 -5 碰撞后只剩下 10 。 5 和 10 永远不会发生碰撞。

示例 2:
输入:asteroids = [8,-8]
输出:[]
解释:8 和 -8 碰撞后,两者都发生爆炸。

示例 3:
输入:asteroids = [10,2,-5]
输出:[10]
解释:2 和 -5 发生碰撞后剩下 -5 。10 和 -5 发生碰撞后剩下 10 。

示例 4:
输入:asteroids = [-2,-1,1,2]
输出:[-2,-1,1,2]
解释:-2 和 -1 向左移动,而 1 和 2 向右移动。 由于移动方向相同的行星不会发生碰撞,所以最终没有行星发生碰撞。

提示:
2 <= asteroids.length <= 104
-1000 <= asteroids[i] <= 1000
asteroids[i] != 0

题解:

本题借用栈来解决,只有±情况才会出现撞击,其余情况均会正常入栈,因此对±情况处理撞击,撞击可能会存在连环撞击,因此撞击完毕后需要回溯;

代码:

class Solution {
   
    public int[] asteroidCollision(int[] asteroids) {
   
        // 直到碰到第一个正数
        Stack<Integer> stack = new Stack<>();

        for(int i=0;i<asteroids.length;i++){
   
            if(stack.empty()){
   
                stack.push(asteroids[i]);
                continue;
            }
            int temp = stack.peek();
            if(temp < 0){
   
                stack.push(asteroids[i]);
                continue;
            }
            else if(temp > 0 && asteroids[i] > 0){
   
                stack.push(asteroids[i]);
                continue;
            }
            else{
   
                // 栈内有效可用数据绝对无负值
                if(Math.abs(asteroids[i]) > temp){
   
                    stack.pop();
                    // 回溯 因可能连环撞击
                    i--;
                }
                else if(Math.abs(asteroids[i]) == temp){
   
                    stack.pop();
                }
                else{
   
                    continue;
                }
            }
        }
        // stack长度会随着pop动态改变 因此需要先拿到静态数据
        int len = stack.size();
        int res[] = new int[len];
        for(int i=0;i<len;i++){
   
            res[len-1-i] = stack.pop();
        }
        return res;
    }
}

结果:

在这里插入图片描述

最近更新

  1. 基于Gunicorn+Flask+Docker模型高并发部署

    2024-02-23 04:00:02       0 阅读
  2. SQL FOREIGN KEY

    2024-02-23 04:00:02       0 阅读
  3. 安全保障措施

    2024-02-23 04:00:02       0 阅读
  4. Android IdleHandler源码分析

    2024-02-23 04:00:02       1 阅读
  5. docker-1

    docker-1

    2024-02-23 04:00:02      1 阅读
  6. Git批量删除本地h和远程分支说明

    2024-02-23 04:00:02       1 阅读
  7. mvccaa

    2024-02-23 04:00:02       1 阅读
  8. Linux 常用指令详解

    2024-02-23 04:00:02       1 阅读
  9. 第2章 源码编译构建LAMP

    2024-02-23 04:00:02       1 阅读

热门阅读

  1. Leetcode | 231. 2 的幂 C语言

    2024-02-23 04:00:02       36 阅读
  2. QT 如何让多语言翻译变得简单,提高效率?

    2024-02-23 04:00:02       27 阅读
  3. Springcloud OpenFeign 的实现(二)

    2024-02-23 04:00:02       32 阅读
  4. Python笔记-super().init(root)的作用

    2024-02-23 04:00:02       29 阅读
  5. git常用命令记录

    2024-02-23 04:00:02       26 阅读
  6. Unity架构师经验分享:基于状态机的逻辑控制

    2024-02-23 04:00:02       31 阅读
  7. golang GOPATH 和GOROOT

    2024-02-23 04:00:02       33 阅读
  8. 【动态规划题目讲解】洛谷P8392 Uplifting Excursion

    2024-02-23 04:00:02       32 阅读