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

其他系列文章导航

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;这种方法虽…

Qt的三大机制(面试)

Qt三大核心机制是信号与槽机制、事件机制和对象模型。 信号与槽机制&#xff1a;Qt中的信号与槽机制是一种用于对象间通信的机制。一个对象可以通过发出信号来通知其他对象&#xff0c;其他对象可以通过槽函数来响应该信号。信号与槽可以跨越不同的线程&#xff0c;实现了对象…

AI:105-基于深度学习的手术操作监控与辅助

🚀点击这里直接跳转到本专栏,可查阅顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

向爬虫而生---Redis 基石篇4 <拓展Set>

前言: 延伸上一篇:https://blog.csdn.net/m0_56758840/article/details/135349796 挖一挖集合的一些骚操作~ 正文: 基本操作: 集合是Redis中的一种数据类型&#xff0c;它具有以下几个基本概念和特性&#xff1a;无重复、无序和集合间的运算。下面是几个常用的集合命令&…

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;让我帮忙指导下…

四种限流算法

四种限流算法 为什么要限流 限流是为了防止系统突然收到大量请求&#xff0c;后台面对大量并发请求对cpu和内存&#xff0c;网络io产生巨大压力&#xff0c;可能将一些服务如mysql&#xff0c;redis等打崩&#xff0c;引发系统故障&#xff0c;服务瘫痪。 固定窗口&#xff…

asp.net core mvc中的viewdata和viewbag的用法

在ASP.NET Core MVC中&#xff0c;ViewData和ViewBag都是用于在控制器中传递数据给视图的方式&#xff0c;但它们在实现上有一些区别。 ViewData是一个ViewDataDictionary对象&#xff0c;它是一个字典&#xff0c;可以通过键值对的方式传递数据。你可以像这样在控制器中设置V…

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

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

LeetCode每周五题_2024/01/01~2024/01/05

文章目录 1599. 经营摩天轮的最大利润 [2024/01/01]题目题解 466. 统计重复个数 [2024/01/02]题目题解 2487. 从链表中移除节点 [2024/01/03]题目题解 1599. 经营摩天轮的最大利润 [2024/01/01] 题目 1599. 经营摩天轮的最大利润 你正在经营一座摩天轮&#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;菜单管…

记一次docker中安装redis的过程

1. Docker搜索redis镜像 docker search redis2. Docker搜索redis镜像 docker pull redis3.Docker挂载配置文件 挂载 redis 的配置文件挂载 redis 的持久化文件&#xff08;为了数据的持久化&#xff09;。 conf文件位置&#xff1a; /home/redis/myredis/redis.conf data文件…

线程池的运行原理和使用案例

在日常开发中&#xff0c;如果需要使用到多线程&#xff0c;最简单的方式是 new Thread&#xff0c;但是这种方式有很大弊端&#xff1a; 首先new Thread 是比较消耗系统性能的&#xff0c;性能比较差&#xff1b;线程缺乏统一的管理&#xff0c;会无限制的创建新线程&#xf…

57个Linux常用命令含参数介绍和使用示例

点击下载《57个Linux常用命令含参数介绍和使用示例》 1. pwd 作用&#xff1a;显示当前所在的工作目录的全路径名称 //显示当前目录 pwd该命令无需任何参数&#xff0c;只需在终端窗口中输入 pwd 命令即可使用。 2. cd 作用&#xff1a;更改当前工作目录。 //跳转目录至D…