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

其他系列文章导航

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 dequeclass Solution:def asteroidCollision(self, asteroids: List[int]) -> List[int]:deque = deque()for i in asteroids:ok = Truewhile ok and deque and deque[-1] > 0 and i < 0:a, b = deque[-1], -iif a <= b: deque.pop()if a >= b: ok = Falseif ok: deque.append(i)return list(deque)

Go版本:

package mainimport "fmt"func asteroidCollision(asteroids []int) []int {var stack []intfor _, i := range asteroids {ok := truefor ok && len(stack) > 0 && stack[len(stack)-1] > 0 && i < 0 {a, b := stack[len(stack)-1], -iif 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)。

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

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

相关文章

【LLM+RS】LLM在推荐系统的实践应用(华为诺亚)

note LLM用于推荐主要还是解决推荐系统加入open domain 的知识。可以基于具体推荐场景数据做SFT。学习华为诺亚-技术分享-LLM在推荐系统的实践应用。 文章目录 note一、背景和问题二、推荐系统中哪里使用LLM1. 特征工程2. 特征编码3. 打分排序 三、推荐系统中如何使用LLM四、挑…

共享WiFi贴项目加盟可以解决商家哪些痛点?

近年来&#xff0c;共享WiFi贴项目在共享商业领域引起了广泛关注。作为一种便捷的网络分享工具&#xff0c;共享WiFi贴不仅受到很多人的青睐&#xff0c;更能够为商家带来诸多实际利益。那么&#xff0c;共享WiFi贴项目加盟究竟可以解决商家哪些痛点呢&#xff1f; 共享WiFi贴为…

【C#】知识点实践序列之Lock的锁定代码块

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂之知识点实践序列》文章。 2024年第1篇文章&#xff0c;此篇文章是C#知识点实践序列之Lock知识点&#xff0c;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 本篇验证Lock锁定代…

Navicat(数据库可视化软件)安装教程以及连接MYSQL

Navicat安装教程以及连接MYSQL Navicat&#xff08;数据库可视化软件&#xff09;安装流程安装MySQLnavicat连接mysql数据库 Navicat&#xff08;数据库可视化软件&#xff09; Navicat 是一款专门为 MySQL 设计的可视化数据库 GUI 管理工具&#xff0c;我们可以在自己的计算机…

深入浅出Python日志打印

0.引言 在编程过程中&#xff0c;日志记录是一项非常重要的任务&#xff0c;无论是用于调试代码、记录系统运行状态&#xff0c;还是跟踪可能出现的问题&#xff0c;日志都能发挥重要作用。然而&#xff0c;许多开发者习惯使用简单的print语句来记录信息&#xff0c;这种方法虽…

ensp vlan连接(详细)

1.将需要的设备放置好 2.将设备连接起来 3.启动所有设备 4.备注好每台PC机的信息 5.配置好每台PC机 6.配置交换机1 进入配置视图&#xff0c;关闭信息提示 重命名设备 批量创建VLAN 开始配置接口 更改接口类型为ACCESS 将接口划分到对应的VLANN 配置下一个接口&#xff0c;步…

编译 nccl-tests 项目

1&#xff0c;编译 下载源代码 git clone --recursive https://github.com/NVIDIA/nccl-tests.git 编译源代码 cd nccl-tests/ make -j 2&#xff0c;运行 cd ./build/ ./all_reduce_perf --help ./all_reduce_perf -b 8 -e 256M -f 2 -g 4 效果图&#xff1a; 3&#…

说说产品经理能力模型

产品经理的能力模型应该是什么样的&#xff0c;可能100个产品人会有100种看法&#xff0c;每个人的认知都是不一样的&#xff0c;今天和大家分享下我对产品经理能力模型的总结。 前段时间&#xff0c;一个30多岁做前端开发的朋友跟我说想转行做产品&#xff0c;让我帮忙指导下…

关于Python里xlwings库对Excel表格的操作(三十)

这篇小笔记主要记录如何【如何使用“Chart类”、“Api类"和“Axes函数”为新图表设置标题文本内容、字体、字号、粗细、正斜、颜色、坐标轴主要网格线】。前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】…

Maple 各版本安装指南

Maple 下载链接 https://pan.baidu.com/s/11hKo1XxZGa0xv3Ivj6fbEA?pwd0531 1.鼠标右击【Maple 2023】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Maple 2023】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Setup】选择【以管理员身…

计算机毕业设计------SSM的公寓房屋出租系统

项目介绍 该项目分为前后台&#xff0c;分为普通用户与管理员两种角色。 前台主要功能包括&#xff1a; 普通用户的注册、登录,房屋列表展示&#xff0c;租房&#xff0c;我的订单、用户中心等功能模块&#xff1b; 后台主要功能包括&#xff1a; 系统设置&#xff1a;菜单管…

航空业数字化展翅高飞,开源网安专业服务保驾护航

​某知名航空公司是中国首批民营航空公司之一&#xff0c;运营国内外航线200多条&#xff0c;也是国内民航最高客座率的航空公司之一。在数字化发展中&#xff0c;该航空公司以数据驱动决策&#xff0c;通过精细化管理、数字创新和模式优化等方式&#xff0c;实现了精准营销和个…

day58算法训练|单调栈part01

参考&#xff1a;代码随想录 单调栈的使用情况&#xff1a; 通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置&#xff0c;此时我们就要想到可以用单调栈了。时间复杂度为O(n)。 单调栈的本质是空间换时间&#xff0c;因为在遍历…

10款值得推荐的Blazor UI组件库

前言 经常看到有小伙伴在DotNetGuide技术社区交流群里问有什么好用的Blazor UI组件库推荐的&#xff0c;本文将分享一些开源、实用、美观的Blazor UI组件库&#xff0c;提供给广大C#/.NET开发者们学习和使用&#xff08;注意&#xff1a;排名不分先后&#xff0c;都是十分优秀…

Python内置类属性__module__属性的使用教程

概要 在Python中&#xff0c;每个对象都有一些内置的属性&#xff0c;这些属性提供了有关对象的一些信息。其中一个内置属性是__module__属性。__module__属性是一个字符串&#xff0c;它表示定义了类或函数的模块的名称。在本篇文章中&#xff0c;我们将详细介绍__module__属…

BUUCTF——Reverse——[GXYCTF2019]luck_guy

1、题目 2、工具 Exeinfo PE&#xff1a;查壳工具。IDA&#xff1a;是一款功能强大的反汇编工具&#xff0c;用于分析和逆向工程二进制文件。python&#xff1a;编写自动化脚本。 3、方法 下载压缩包&#xff0c;解压得到一个没有后缀的文件。 用Exeinfo PE查询该文件是否加…

sql:定时执行存储过程(嵌套存储过程、使用游标)

BEGINDeclare FormNo nvarchar(20) --单号Declare Type nvarchar(50) --类型Declare PickedQty float -Declare OutQty float Declare 生产量 floatDeclare 已装箱数量 float Declare 已入库数量 floatDeclare 损耗数量 float Declare 退货品出库数量 intdeclare k c…

C++面向对象编程与泛型编程(GP)

C既支持面向对象编程&#xff0c;又支持泛型编程 1.面向对象编程 将数据结构与处理方法&#xff08;容器与算法&#xff09;组成对象封装在一个类中&#xff0c;通过类的封装隐藏内部细节&#xff0c;可以使用继承&#xff0c;多态等方法。 注意&#xff1a;list容器本身带有…

【计算机毕业设计】SSM实现的在线农产品商城

项目介绍 本项目分为前后台&#xff0c;且有普通用户与管理员两种角色。 用户角色包含以下功能&#xff1a; 用户登录,查看首页,按分类查看商品,查看新闻资讯,查看关于我们,查看商品详情,加入购物车,查看我的订单,提交订单,添加收获地址,支付订单等功能。 管理员角色包含以…

LiveGBS国标GB/T28181流媒体平台功能-国标级联中作为下级平台对接海康大华宇视华为政务公安内网等GB28181国标平台查看级联状态及会话

LiveGBS国标级联中作为下级平台对接海康大华宇视华为政务公安内网等GB28181国标平台查看级联状态及会话 1、GB/T28181级联是什么2、搭建GB28181国标流媒体平台3、获取上级平台接入信息3.1、如何提供信息给上级3.2、上级国标平台如何添加下级域3.2、接入LiveGBS示例 4、配置国标…