【算法】行星碰撞机器人碰撞(栈的使用)

news2024/12/23 22:34:55

文章目录

  • 行星碰撞
  • 机器人碰撞
  • 参考资料

本文记录了两个使用栈来处理碰撞问题的算法题目。

行星碰撞

https://leetcode.cn/problems/asteroid-collision/
在这里插入图片描述

对于这种题目,各个元素分别会向左或向右移动,可以使用栈模拟碰撞的过程。
由于从左往右进行遍历,因此遍历当前元素时,如果它是向右移动的,就只可能会碰撞到它右边还没有被遍历到的元素,因此可以将其直接放入栈中。
当遍历到向左移动的元素时,它只可能碰撞到当前已经在栈中的元素,需要进行一些处理。

class Solution {
    public int[] asteroidCollision(int[] asteroids) {
        Deque<Integer> stk = new ArrayDeque();
        for (int asteroid: asteroids) {
            if (asteroid > 0) {		// 向右移动的直接放入栈中
                stk.push(asteroid);
                continue;
            }
            boolean f = true;  // 记录这个向左的陨石是否还活着
            while (!stk.isEmpty() && stk.peek() > 0) {
                if (stk.peek() + asteroid >= 0) {
                    if (stk.peek() + asteroid == 0) stk.pop();
                    f = false;  // 被撞死了
                    break;
                }
                f = true;
                stk.pop();
            }
            if (f) stk.push(asteroid);		// 没被撞死就放入栈中
        }
        int n = stk.size();		// 由于下面取元素的时候,栈中元素会不断减少,因此需要提前声明 n
        int[] ans = new int[n];
        for (int i = 0; i < n; ++i) ans[n - 1 - i] = stk.pop();
        return ans;
    }
}

对于这道题目来说,无非只有三种结果:1.没撞过 2.撞过了 3.同归于尽了。分类写 if 即可。

注意在取出栈中元素的过程中,stk.size() 一直在发生变化,因此代码最后不能写成:

for (int i = 0; i < stk.size(); ++i) ans[stk.size() - 1 - i] = stk.pop();

而必须是事先 通过 int n = stk.size() 接收原始结果中元素的个数。

机器人碰撞

https://leetcode.cn/problems/robot-collisions/
题目出自:第 351 场周赛
在这里插入图片描述

这道题目与 行星碰撞 几乎如出一辙,因此代码模板是一样的,差异几乎只存在于 遍历到向左移动的元素时,处理的方式不同。

class Solution {
    public List<Integer> survivedRobotsHealths(int[] positions, int[] healths, String directions) {
        int n = positions.length;
        Integer[] id = new Integer[n];
        for (int i = 0; i < n; ++i) id[i] = i;  // 记录下标用于排序
        Arrays.sort(id, (i, j) -> positions[i] - positions[j]); // 按照位置从左往右排序

        Deque<Integer> stk = new ArrayDeque();
        for (int i: id) {
            if (directions.charAt(i) == 'R') {  // 向右,加入栈
                stk.push(i);
                continue;
            }
            while (!stk.isEmpty()) {
                int top = stk.peek();
                if (healths[top] > healths[i]) {    // 栈顶的健康度大
                    healths[top]--;
                    healths[i] = 0;
                    break;
                }
                if (healths[top] == healths[i]) {    // 一样大
                    healths[stk.pop()] = 0;
                    healths[i] = 0;
                    break;
                } 
                // 新来的健康度大
                healths[stk.pop()] = 0;     
                healths[i]--;
                // 不需要将向左移动的机器人加入栈,因为如果它撞完了左边向右移动的,就不会再与任何机器人发生碰撞了
            }
        }
        List<Integer> ans = new ArrayList();
        for (int h: healths) {
            if (h != 0) ans.add(h);
        }
        return ans;
    }
}

注意由于机器人的 positions 是乱序的,而我们是需要按照位置的从左到右关系进行遍历,因此常用如下操作对下标进行排序。

Integer[] id = new Integer[n];
for (int i = 0; i < n; ++i) id[i] = i;  // 记录下标用于排序
Arrays.sort(id, (i, j) -> positions[i] - positions[j]); // 按照位置从左往右排序

之所以声明 Integer[] 而不是 int[] 是因为 在 Java 中 int[] 不支持自定义排序。(关于Java 自定义排序可见:【Java】自定义排序)

注意虽然 int[] 不支持,但 int[][] 是支持的,因为 int[][] 的元素是 int[],已经是引用类型了。


参考资料


栈模拟(Python/Java/C++/Go)

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

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

相关文章

Argis通过Python的Arcpy第三方库进行字段计算、批量将mxd导出为jpg图片、合并数据库

前言 近来公司有开发Arcgis脚本工具的需求&#xff0c;我就去学了一下用Arcpy来操作Arcgis的数据&#xff0c;今天学习了字段计算&#xff0c;将学习成果记录如下。 arcpy帮助文档传送门&#xff1a;https://resources.arcgis.com/zh-cn/help/main/10.2/ 一、字段计算 1、…

Linux学习之内核升级

wget --no-check-certificate https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.1.14.tar.xz下载源代码。 yum install -y gcc gcc-c make ncurses-devel openssl-devel elfutils-libelf-devel安装必要的依赖包。 完成之后&#xff0c;显示如下&#xff1a; …

openEuler操作系统和openGauss数据库

文章目录 1. openEuler操作系统2. openGauss数据库2.1 系统自带库2.1.1 允许所有地址访问端口2.1.2 创建远程登录用户 2.2 安装5.0 版本2.2.1 下载2.2.2 安装2.2.3 测试 1. openEuler操作系统 镜像下载地址 https://www.openeuler.org/zh/download 选一个下载 安装 按提示安…

【kubernetes系列】Kubernetes中的重要概念(三)

在实际的工作中&#xff0c;我们使用Kubernetes 通常不会直接创建 Pod&#xff0c;而是通过 各种 Controller 来管理 Pod 的。Controller 中定义了 Pod 的部署特性&#xff0c;比如有几个副本&#xff0c;在什么样的 Node 上运行等。为了满足不同的业务场景&#xff0c;Kuberne…

VMware Workstation 17 的安装

一、简介 VMware Workstation 17.0是一款功能非常强大的虚拟机&#xff0c;可以帮助用户在Windows系统上同时开启多个系统&#xff0c;不仅能在虚拟机上安装上不同的操作系统&#xff0c;比如Mac、Linux以及Windows10/11等&#xff0c;还能与云技术和容器技术&#xff08;如 D…

【金融量化】ETF基金是什么?有什么特点?

1 含义 ETF&#xff08;交易型开放式指数基金&#xff09;是以某一选定的指数所包含的成分证券或商品为投资对象&#xff0c;依据构成指数的证券或商品的种类和比例&#xff0c;采取完全复制或抽样复制&#xff0c;进行被动投资的指数基金。ETF不但具有传统指数基金的全部特色…

vue导出excle单sheet文字居中表头加粗显示

效果图&#xff1a; 首先下载依赖 npm install xlsx --save npm install xlsx-style --save在需要导出excle的vue文件中导入依赖 import XLSX from "xlsx" import XLSXStyle from xlsx-style在method中定义 methods:{// 格式化formatJson(filterVal, jsonData)…

月近万次发布,故障率<4‰如何做到?去哪儿测试左移重难点揭秘!

一分钟精华速览 去哪儿发布的数据显示&#xff0c;在过去一年中&#xff0c;其发布故障率始终保持在 4‰ 以下并不断降低。作为一家出行旅游服务平台&#xff0c;去哪儿网如何在复杂的业务场景下&#xff0c;仍能保持如此低的故障率&#xff1f;其中功能测试左移功不可没。 本…

高质量编程-编码规范之代码格式和注释

前言&#xff1a; \textcolor{Green}{前言&#xff1a;} 前言&#xff1a; &#x1f49e;这个专栏就专门来记录一下寒假参加的第五期字节跳动训练营 &#x1f49e;从这个专栏里面可以迅速获得Go的知识 本次文章不仅仅是在 go 中主要注意&#xff0c;在编写其他语言中也同样重要…

单片机介绍选型(嵌入式学习)

单片机介绍&选型 单片机介绍常见的单片机单片机如何选型 单片机介绍 单片机&#xff08;Microcontroller&#xff09;是一种集成电路芯片&#xff0c;具有处理器核心、存储器、输入/输出接口和各种外设的功能。 单片机是单片微型计算机的简称&#xff0c;MCU是Microcontro…

15. WebGPU 相机

在上一篇文章中&#xff0c;我们必须将 F 移到视锥体前面&#xff0c;因为 mat4.perspective 函数 将眼睛放在原点 (0, 0, 0) 并且把对象 放到 位于眼前 -zNear 到 -zFar 之间的视锥体中。这意味着&#xff0c;任何想要显示的东西&#xff0c;都需要放在这个空间里。 在现实世…

对英雄联盟英雄属性数据的预处理及相似度矩阵计算

目录 一、引言 二、任务1 1、填充缺失值 2、用中位数填充“生命值”属性列缺失值 3、 用均值填充“生命值”属性列缺失值 三、任务2 注&#xff1a;英雄联盟英雄属性数据资源可在博客资源中自行获取。 一、引言 英雄联盟作为一款古早的刀塔游戏&#xff0c;可谓之刀塔游…

jumpserver-v2.2.2【部署教程】

目录 什么是 跳板机 跳板机的缺点 使用堡垒机的优势 jumpserver的组件 【1】时间同步 【2】安装依赖 【3】修改数据库字符集、创建远程用户 【4】创建python的虚拟环境&#xff0c;用于专门运行jumpserver的环境 【5】获取jumpserver的代码 【6】安装编译环境依赖 …

【管理系列-09】软件成本怎么评估,知己知彼才能做软件造价

项目来了&#xff0c;总要叫来几个人&#xff0c;讨论一下成本是多少&#xff0c;能不能接&#xff0c;作为研发经理&#xff0c;能够较为合理的评估成本是一项必备技能&#xff0c;如何科学合理的评估&#xff0c;达到对内对外都满意&#xff0c;我想这是每个研发经理的必修课…

管理类联考——逻辑——知识篇——分析推理——四、数字——haimian

数字 题型识别 与数字相关的分析推理题在逻辑科目中扮演着非常重要的角色&#xff0c;可能涉及方程、不等式、分子与分母比值关系、百分比、概率、集合运算等&#xff0c;可结合数学方法或利用数字规律进行解题。 思维导图 常用公式 从某种意义上说&#xff0c;数学本身就是…

五、浅析[ElasticSearch]底层原理与分组聚合查询

目录 一、ElasticSearch文档分值_score计算底层原理1.boolean model2.relevance score算法2、分析一个document上的_score是如何被计算出来的 二、分词器工作流程1.character filter、tokenizer、token filter2、内置分词器的简单介绍3、定制分词器3.1默认的分词器--standard3.…

《教我兄弟学Android逆向13 xpose改机开发01-环境设置》

上一篇 《教我兄弟学Android逆向12 编写xposed模块》 我们了解了xpose的基本原理并一起搭建了xpose的hook环境&#xff0c;你也很好的完成了课后作业&#xff0c;但是通过后面的测试练习你发现xpose在不同系统环境的安装方法是不一样的,在我们之前的低系统手机上面直接安装就能…

LNMP六个实验

目录 访问状态统计配置 基于授权的访问控制 基于客户端的访问控制 基于域名的 Nginx 虚拟主机 基于IP 的 Nginx 虚拟主机 基于端口的 Nginx 虚拟主机 总结 访问状态统计配置 查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块 修改 nginx.conf 配置文件&#xff0c;…

Python基础四

目录 一、Python数据类型--列表 1.列表的下标 2.访问列表中的元素 3.更新列表元素 4.删除列表元素 5.列表脚本操作符 6.列表截取与拼接 截取 拼接 7.嵌套列表 8.列表比较 二、Python内置函数--列表相关 一、Python数据类型--列表 Python中的列表类似于java的数组 列…

Rust语言从入门到入坑——(7)Rust 错误处理

文章目录 0 引入1、可恢复错误2、可恢复错误递归3、不可恢复错误4、kind 方法5、总结 0 引入 Rust 有一套独特的处理异常情况的机制&#xff0c;程序中一般会出现两种错误&#xff1a;可恢复错误和不可恢复错误。 1、可恢复错误的典型案例是文件访问错误&#xff0c;如果访问一…