Leetcode 剑指 Offer II 037. 小行星碰撞

news2024/9/24 9:23:29

题目难度: 中等

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

给定一个整数数组 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 <= 10^4
  • -1000 <= asteroids[i] <= 1000
  • asteroids[i] != 0

题目思考

  1. 可以使用什么数据结构模拟整个过程?

解决方案

思路

  • 分析题目, 我们在处理一个新的小行星时, 需要判断它和之前的小行星的方向和大小关系
  • 这显然是一个后进先出的过程, 我们可以使用栈来模拟它, 并依次遍历数组中每个小行星
  • 如果当前小行星向左, 那么需要判断栈顶方向:
    • 如果栈顶也向左, 则不会碰撞, 直接入栈
    • 如果栈顶向右, 则进一步比较两者大小关系:
      • 如果栈顶大于当前小行星, 则当前小行星会爆炸, 不再继续处理栈中其他元素
      • 如果栈顶等于当前小行星, 则栈顶和当前小行星都会爆炸, 将栈顶弹出, 不再继续处理栈中其他元素
      • 如果栈顶小于当前小行星, 则栈顶会爆炸, 将栈顶弹出, 继续处理下一个栈顶
  • 如果当前小行星向右, 则直接将其入栈, 等待后续处理
  • 最终栈中剩余元素就是碰撞后剩下的小行星, 返回它即可
  • 下面的代码就对应了上面的整个过程, 并且有详细的注释, 方便大家理解

复杂度

  • 时间复杂度 O(N): 只需要遍历整个数组一遍
  • 空间复杂度 O(N): 栈最多存 N 个元素

代码

class Solution:
    def asteroidCollision(self, asteroids: List[int]) -> List[int]:
        stack = []
        for x in asteroids:
            if x < 0:
                # 当前行星向左
                while stack and stack[-1] > 0:
                    # 只有当栈顶行星向右才判断
                    if stack[-1] > -x:
                        # 栈顶更大, 当前行星会爆炸, 退出循环
                        break
                    elif stack[-1] == -x:
                        # 两者大小相等, 都会爆炸, 退出循环
                        stack.pop()
                        break
                    else:
                        # 当前行星更大, 栈顶行星会爆炸, 继续循环
                        stack.pop()
                else:
                    # 没有break, 说明当前行星仍在, 将其加入栈中
                    stack.append(x)
            else:
                # 当前行星向右, 直接入栈
                stack.append(x)
        # 最后的栈就是碰撞后剩余的行星
        return stack

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/810683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-jQuery - Dragable拖动函数

Drag-able 函数可与JqueryUI中的交互一起使用。此函数可在任何DOM元素上启用可拖动功能。无涯教程可以通过使用鼠标单击来拖动可拖动元素。 Drag able - 语法 $( "#draggable" ).draggable(); Drag able - 示例 下面是一个简单的示例&#xff0c;显示可拖动的用法…

【Java面试丨消息中间件】Kafka

一、kafka是如何保证消息不丢失 1. 介绍 使用kafka在消息的收发过程都有可能会出现消息丢失 &#xff08;1&#xff09;生产者发送消息到broker丢失 &#xff08;2&#xff09;消息在broker中存储丢失 &#xff08;3&#xff09;消费者从broker接收消息丢失 2. 生产者发送消…

002-Spring Bean 从扫描到创建

目录 Spring Bean 从扫描到创建扫描流程 class 到 BeanDefinition引入扫描&#xff1a;ClassPathBeanDefinitionScannerdoScanfindCandidateComponents(basePackage)registerDefaultFilters()this.registry 创建流程 BeanDefinition 到 Bean统一 BeanDefinition 类型finishBean…

HTML+CSS+JavaScript:轮播图自动播放

一、需求 轮播图如下图所示&#xff0c;需求是每隔一秒轮播图自动切换一次 二、代码素材 以下是缺失JS部分的代码&#xff0c;感兴趣的小伙伴可以先自己试着写一写 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /&…

【笔记】Java并发编程

Callable 和 Runable Java 8 并发教程&#xff1a;Threads和Executors 原文&#xff1a;Java 8 Concurrency Tutorial: Threads and Executors 译者&#xff1a;BlankKelly 来源&#xff1a;Java8并发教程&#xff1a;Threads和Executors 两种提交方式 submit和execute subm…

【数据结构】带头+双向+循环链表(DList)(增、删、查、改)详解

一、带头双向循环链表的定义和结构 1、定义 带头双向循环链表&#xff0c;有一个数据域和两个指针域。一个是前驱指针&#xff0c;指向其前一个节点&#xff1b;一个是后继指针&#xff0c;指向其后一个节点。 // 定义双向链表的节点 typedef struct ListNode {LTDataType dat…

开发一个RISC-V上的操作系统(五)—— 协作式多任务

目录 往期文章传送门 一、什么是多任务 二、代码实现 三、测试 往期文章传送门 开发一个RISC-V上的操作系统&#xff08;一&#xff09;—— 环境搭建_riscv开发环境_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统&#xff08;二&#xff09;—— 系统引导程序&a…

NO4 实验四:生成Web工程

1、说明 使用 mvn archetype&#xff1a;generate 命令生成 Web 工程时&#xff0c;需要使用一个专门的 archetype。这个专门生成 Web 工程骨架的 archetype 可以参照官网看到它的用法&#xff1a; 2、操作 注意&#xff1a;如果在上一个工程的目录下执行 mvn archetype&…

LeetCode208.Implement-Trie-Prefix-Tree<实现 Trie (前缀树)>

题目&#xff1a; 思路&#xff1a; tire树&#xff0c;学过&#xff0c;模板题。一种数据结构与算法的结合吧。 代码是&#xff1a; //codeclass Trie { private:bool isEnd;Trie* next[26]; public:Trie() {isEnd false;memset(next, 0, sizeof(next));}void insert(strin…

第72篇:近年HVV、红队攻防比赛中常见外围打点漏洞的分析与总结

前言 大家好&#xff0c;我是ABC_123。前一段时间我花时间花精力总结了最近两三年中&#xff0c;在攻防比赛中比较常见的Web打点漏洞类型&#xff0c;捎带着把钓鱼邮件的主题类型也总结了一下。今天分享出来&#xff0c;相信无论是对于攻击方还是防守方&#xff0c;都能从中获…

【雕爷学编程】MicroPython动手做(14)——掌控板之OLED屏幕2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

Spring学习笔记之spring概述

文章目录 Spring介绍Spring8大模块Spring特点 Spring介绍 Spring是一个轻量级的控制反转和面向切面的容器框架 Spring最初的出现是为了解决EJB臃肿的设计&#xff0c;以及难以测试等问题。 Spring为了简化开发而生&#xff0c;让程序员只需关注核心业务的实现&#xff0c;尽…

从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理

ExceptionHandler的作用 ExceptionHandler是Spring框架提供的一个注解&#xff0c;用于处理应用程序中的异常。当应用程序中发生异常时&#xff0c;ExceptionHandler将优先地拦截异常并处理它&#xff0c;然后将处理结果返回到前端。该注解可用于类级别和方法级别&#xff0c;…

【RabbitMQ】golang客户端教程1——HelloWorld

一、介绍 本教程假设RabbitMQ已安装并运行在本机上的标准端口&#xff08;5672&#xff09;。如果你使用不同的主机、端口或凭据&#xff0c;则需要调整连接设置。如果你未安装RabbitMQ&#xff0c;可以浏览我上一篇文章Linux系统服务器安装RabbitMQ RabbitMQ是一个消息代理&…

STL 关于vector的细节,vector模拟实现【C++】

文章目录 vector成员变量默认成员函数构造函数拷贝构造赋值运算符重载函数析构函数 迭代器beginend size和capacityresizereserve[ ]push_backpop_backinserteraseswap vector成员变量 _start指向容器的头&#xff0c;_finish指向容器当中有效数据的下一个位置&#xff0c;_end…

Python(五十一)获取列表中的多个元素——切片操作

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

【Rust教程 | 基础系列1 | Rust初相识】Rust简介与环境配置

教程目录 前言一&#xff0c;Rust简介1&#xff0c;Rust的历史2&#xff0c;Rust的特性3&#xff0c;为什么选择Rust4&#xff0c;Rust可以做什么 二&#xff0c; Rust环境配置1&#xff0c;windows11安装2&#xff0c;Linux安装 三&#xff0c;安装IDE 前言 Rust是一种系统编…

谈谈3D打印技术

目录 1.什么是3D打印 2.3D打印与传统打印技术的不同之处 3. 3D打印带来的技术变革 1.什么是3D打印 3D打印技术&#xff0c;也称为增材制造&#xff08;Additive Manufacturing&#xff09;&#xff0c;是一种将数字模型转化为实体物体的制造方法。它通过逐层添加材料的方式&a…

一文了解MySQL中的多版本并发控制

在开始之前&#xff0c;先抛出一个问题&#xff1a;我们都知道&#xff0c;目前&#xff08;MySQL 5.6以上&#xff09;数据库已普遍使用InnoDB存储引擎&#xff0c;InnoDB相对于MyISAM存储引擎其中一个好处就是在数据库级别锁和表级别锁的基础上支持了行锁&#xff0c;还有就是…

windows环境安装elasticsearch+kibana并完成JAVA客户端查询

下载elasticsearch和kibana安装包 原文连接&#xff1a;https://juejin.cn/post/7261262567304298554 elasticsearch官网下载比较慢&#xff0c;有时还打不开&#xff0c;可以通过https://elasticsearch.cn/download/下载&#xff0c;先找到对应的版本&#xff0c;最好使用迅…