【数据结构和算法】小行星碰撞

2024-01-04

其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、题目描述

二、题解

2.1 什么情况会用到栈

2.2 方法一:模拟 + 栈

三、代码

3.1 方法一:模拟 + 栈

四、复杂度分析

4.1 方法一:模拟 + 栈


前言

这是力扣的 735 题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。

慢慢开始栈的模块了,这道题是一道非常好的栈的例题,很有代表性。


一、题目描述

给定一个整数数组 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 。
  

提示:

  • 2 <= asteroids.length <= 104
  • -1000 <= asteroids[i] <= 1000
  • asteroids[i] != 0

二、题解

2.1 什么情况会用到栈

栈是一种数据结构,其特点是后进先出(Last In First Out,LIFO)。在算法中,栈在很多情况下是非常有用的,下面是一些常见的情况:

  1. 括号匹配 :当你有一个包含括号的字符串,并且你想要检查这个字符串中的括号是否匹配,你可以使用栈。从左到右扫描字符串,如果遇到左括号(如“(”,“{”或“[”),则将其压入栈。如果遇到右括号,则从栈顶弹出一个元素并检查它们是否匹配。如果它们不匹配,那么这个字符串就不是有效的。
  2. 深度优先搜索(DFS) :在图的遍历中,栈经常被用于实现深度优先搜索。首先,将起始节点压入栈。然后,当栈不为空时,弹出栈顶元素并访问它。对于每个刚刚访问过的节点,将其未被访问过的邻居节点压入栈。
  3. 函数调用 :在计算机程序的执行中,函数调用通常使用栈来管理。当一个函数被调用时,它的参数和局部变量被压入栈。当函数执行结束时,这些数据从栈中弹出。
  4. 文本编辑器中的撤销/重做功能 :许多文本编辑器使用撤销/重做功能来允许用户撤销他们最近所做的更改。这些功能通常使用一个操作栈,每个操作(例如插入或删除文本)都被压入栈。用户可以多次撤销,每次撤销都从栈中弹出并反转一个操作。
  5. 解析语法 :在编译原理中,栈被广泛用于解析语法。例如,在解析一个算术表达式时,你可以使用栈来保持追踪括号和操作符的优先级。

这只是栈在算法中的一些应用,实际上还有很多其他的应用场景。

2.2 方法一:模拟 + 栈

思路与算法:

由于碰撞抵消总是从相邻行星之间发生,我们可以使用「栈」来模拟该过程。

从前往后处理所有的 asteroids[i] ,使用栈存储当前未被抵消的行星,当栈顶元素方向往右,当前 asteroids[i] 方向往左时,会发生抵消操作,抵消过程根据规则进行即可。

用到变量 ok 的 true 和 false 来表示待插入栈的元素是否还大于栈顶元素。

最后把栈内元素再放入 int[] 中。


三、代码

3.1 方法一:模拟 + 栈

Java版本:

class Solution {
    public static int[] asteroidCollision(int[] asteroids) {
       ArrayDeque<Integer> deque = new ArrayDeque<>();
        for (int i : asteroids) {
            boolean ok = true;
            while (ok && !deque.isEmpty() && deque.peekLast() > 0 && i < 0) {
                int a = deque.peekLast(), b = -i;
                if (a <= b) deque.pollLast();
                if (a >= b) ok = false;
            }
            if (ok) deque.addLast(i);
        }
        int n = deque.size();
        int[] res = new int[n];
        while(!deque.isEmpty()) res[--n]=deque.pollLast();
        return res;
    }
}

C++版本:

class Solution {
public:
    static vector<int> asteroidCollision(vector<int>& asteroids) {
        deque<int> deque;
        for (int i : asteroids) {
            bool ok = true;
            while (ok && !deque.empty() && deque.back() > 0 && i < 0) {
                int a = deque.back(), b = -i;
                if (a <= b) deque.pop_back();
                if (a >= b) ok = false;
            }
            if (ok) deque.push_back(i);
        }
        vector<int> res(deque.begin(), deque.end());
        return res;
    }
};

Python版本:

from collections import deque

class Solution:
    def asteroidCollision(self, asteroids: List[int]) -> List[int]:
        deque = deque()
        for i in asteroids:
            ok = True
            while ok and deque and deque[-1] > 0 and i < 0:
                a, b = deque[-1], -i
                if a <= b: 
                    deque.pop()
                if a >= b: 
                    ok = False
            if ok: 
                deque.append(i)
        return list(deque)

Go版本:

package main

import "fmt"

func asteroidCollision(asteroids []int) []int {
    var stack []int
    for _, i := range asteroids {
        ok := true
        for ok && len(stack) > 0 && stack[len(stack)-1] > 0 && i < 0 {
            a, b := stack[len(stack)-1], -i
            if a <= b {
                stack = stack[:len(stack)-1]
            }
            if a >= b {
                ok = false
            }
        }
        if ok {
            stack = append(stack, i)
        }
    }
    return stack
}

func main() {
    asteroids := []int{5, 10, -5}
    fmt.Println(asteroidCollision(asteroids))
}

四、 复杂度分析

4.1 方法一:模拟 + 栈

  • 时间复杂度:O(n)。
  • 空间复杂度:O(n)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构和算法】小行星碰撞 的相关文章

  • Gradle 构建错误:无法从 https://repo1.maven.org/maven2/io/fabric/tools/gradle/maven-metadata.xml 加载 Maven 元数据

    我在 Android studio 中遇到 gradle 构建错误 如下所示 Error A problem occurred configuring project MyApp Could not resolve all dependen
  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 新导物联rfid人员定位管理系统

    rfid人员定位管理系统是一个智能化的人员定位导航和监控系统 它具备数据信息收集 精确查询 统计分析等功能 rfid人员定位管理系统 包含了人员信息数据搜集 统计分析和管理方法三个层面的内容 在人员信息数据收集层面 可以实现不同单位 不同身
  • 欢迎来到阿清的数据分析求职分享

    大家好 我是阿清 在这里 我将与大家分享关于数据分析岗位求职路上的点点滴滴 包括行业和岗位的深入见解 求职技巧 面试准备方法 以及实战案例分析等等 关于我 正经工作履历 2015年东南大学计算机专业研究生毕业 校招身份加入了阿里 最初参与面
  • C#属性介绍

    文章目录 一 简要介绍 二 详细介绍 2 1 例子 2 2 属性和字段的比较 2 3 自动实现属性 2 4 静态属性 2 5 只读 只写属性 2 6 属性可访问性
  • HDMI光端机技术概述:高清多媒体传输的前沿

    在数字多媒体传输领域 HDMI光端机 代表着高清传输技术的前沿 作为现代视听设备的标准接口 HDMI光端机在高清视频和音频传输方面的应用日益广泛 它不仅支持更高的分辨率和更丰富的色彩 还提供了更加稳定和高效的传输方式 技术特点 高清晰度传输
  • 实验笔记之——下载数据到服务器

    开发过程中经常需要把数据传到服务器上 太麻烦了 为此本博文记录采用百度云来传输数据 百度云 使用 bypy 包 安装 pip install bypy 配置bypy连接百度网盘 终端输入bypy info 将命令行提示的链接复制到浏览器 并
  • 技术大拿私房课:掌握Task、Thread、ThreadPool的终极秘籍!

    大家好 我是小米 在这个充满技术和创新的时代 作为一名喜欢分享的技术探索者 我想和大家聊一聊一些在社招面试中常常被提到的热门话题 task thread threadpool 这是一组关于并发编程的核心问题 也是我们在日常工作中不可避免要面
  • A Survey of Graph Meets Large Language Model: Progress and Future Directions

    本文是LLM系列文章 针对 A Survey of Graph Meets Large Language Model Progress and Future Directions 的翻译 当图遇到大型语言模型综述 进展与未来方向 摘要 1
  • CAN光端机技术指南:工业网络通信的高效解决策略

    在现代工业自动化和车辆网络通信中 CAN光端机 技术扮演着不可或缺的角色 它为控制器局域网 Controller Area Network CAN 提供了高效 稳定的数据传输解决方案 使得在复杂和严苛的工业环境中 数据通信更加可靠和高效 技
  • Vivado ILA的debug信息保存与读取

    保存 write hw ila data D Project FPGA ILA Debug Data 202401041115 ila upload hw ila data hw ila 1 读取 display hw ila data r
  • 数据分析求职-岗位介绍

    这是咱们干货开始的第一篇文章 后续我尽量会保持日更的节奏和大家做分享 在未来所有分享的内容展开之前 咱们有必要先彻底 深入地了解下数据分析这个岗位 如果你还在犹豫是否要走数据分析的路 或者你已经拿了数据分析的offer想了解下将来会做什么
  • d3dcompiler_43.dll丢失怎么修复?怎么解决

    在计算机使用过程中 我们经常会遇到一些错误提示 其中之一就是 找不到d3dcompiler 43 dll文件 那么 d3dcompiler 43 dll是什么文件 它的作用是什么 如果缺失了该如何修复呢 本文将详细介绍d3dcompiler
  • docker login失败 x509: certificate relies on legacy common name field use sans instead

    执行docker pull和docker login都不成功 docker pull Using default tag latest Error response from daemon Get https xx comv2 x509 c
  • 【linux】日志管理和分析

    一 概述 在Linux系统的管理和运维中 日志文件起到至关重要的作用 它们记录了系统运行过程中的各种事件 包括系统故障 性能数据和安全事件 二 日志的作用和分类 日志的作用 日志文件记载了系统的生命线 利用它们可以 1 诊断系统故障 2 监
  • 算法设计与分析 | 一般背包问题

    题目描述 某天KID利用飞行器飞到了一个金银岛上 上面有许多珍贵的金属 KID虽然更喜欢各种宝石的艺术品 可是也不拒绝这样珍贵的金属 但是他只带着一个口袋 口袋至多只能装重量为 W 的物品 岛上金属有 s 个种类 每种金属重量不同 分别为
  • 数据分析求职-面试技巧

    之前咱们已经分享了岗位介绍 求职准备思路 简历如何准备 今天咱俩聊一聊面试的技巧 1 面试流程 咱们先聊聊面试的基本流程 简历 笔试筛选 gt 技术初面 gt 技术二面 gt 技术三面 gt 技术交叉面 gt HR面 这个过程中有几个点值得
  • 【设计模式之美】面向对象分析方法论与实现(二):需求到接口实现的方法论

    文章目录 一 进行面向对象设计 1 划分职责 gt 需要有哪些类 2 定义类及其属性和方法 3 定义类与类之间的交互关系 4 将类组装起来并提供执行入口 二 如何进行面向对象编程 1 接口实现
  • IP地址定位技术成为遏制网络水军的重要突破口

    随着互联网的普及 网络水军成为一种新兴的势力 他们通过散播虚假信息 恶意评论等行为 严重影响了网络环境的健康有序 为了遏制网络水军的活动 许多技术手段和法律制裁手段被广泛应用 其中 IP地址定位技术成为了关键突破口 首先 通过识别网络水军的
  • 办公软件PDF编辑器助力高效创建与编辑PDF,页码导出更便捷,使用PDF软件不求人

    在繁忙的工作生活中 高效 便捷的文档处理工具显得尤为重要 首助编辑高手软件凭借其出色的功能和用户体验 成为了许多用户的首选 今天 我们将重点介绍该软件在快速新建PDF文档 编辑内容以及导出时显示页码方面的优势 1 PDF编辑工具 支持批量转
  • Socket.D 替代 http 协议像 Ajax 一样开发前端接口

    我们在 前端接口 开发时 使用 socket d 协议有什么好处 功能上可以替代 http 和原生 ws 安全 安全 安全 现有的工具想抓包数据 难 难 难 socket d 是个新的二进制协议 1 Socket D 协议特点 基于事件 每
  • 【数据结构和算法】小行星碰撞

    其他系列文章导航 Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一 题目描述 二 题解 2 1 什么情况会用到栈 2 2 方法一 模拟 栈 三 代码 3 1