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

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(使用前将#替换为@)

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

随机推荐

  • 新导物联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