【栈】2751. 机器人碰撞

本文涉及知识点

LeetCode2751. 机器人碰撞

现有 n 个机器人,编号从 1 开始,每个机器人包含在路线上的位置、健康度和移动方向。
给你下标从 0 开始的两个整数数组 positions、healths 和一个字符串 directions(directions[i] 为 ‘L’ 表示 向左 或 ‘R’ 表示 向右)。 positions 中的所有整数 互不相同 。
所有机器人以 相同速度 同时 沿给定方向在路线上移动。如果两个机器人移动到相同位置,则会发生 碰撞 。
如果两个机器人发生碰撞,则将 健康度较低 的机器人从路线中 移除 ,并且另一个机器人的健康度 减少 1 。幸存下来的机器人将会继续沿着与之前 相同 的方向前进。如果两个机器人的健康度相同,则将二者都从路线中移除。
请你确定全部碰撞后幸存下的所有机器人的 健康度 ,并按照原来机器人编号的顺序排列。即机器人 1 (如果幸存)的最终健康度,机器人 2 (如果幸存)的最终健康度等。 如果不存在幸存的机器人,则返回空数组。
在不再发生任何碰撞后,请你以数组形式,返回所有剩余机器人的健康度(按机器人输入中的编号顺序)。
注意:位置 positions 可能是乱序的。

示例 1:

在这里插入图片描述

输入:positions = [5,4,3,2,1], healths = [2,17,9,15,10], directions = “RRRRR”
输出:[2,17,9,15,10]
解释:在本例中不存在碰撞,因为所有机器人向同一方向移动。所以,从第一个机器人开始依序返回健康度,[2, 17, 9, 15, 10] 。
示例 2:
在这里插入图片描述

输入:positions = [3,5,2,6], healths = [10,10,15,12], directions = “RLRL”
输出:[14]
解释:本例中发生 2 次碰撞。首先,机器人 1 和机器人 2 将会碰撞,因为二者健康度相同,二者都将被从路线中移除。接下来,机器人 3 和机器人 4 将会发生碰撞,由于机器人 4 的健康度更小,则它会被移除,而机器人 3 的健康度变为 15 - 1 = 14 。仅剩机器人 3 ,所以返回 [14] 。
示例 3:

在这里插入图片描述

输入:positions = [1,2,5,6], healths = [10,10,11,11], directions = “RLRL”
输出:[]
解释:机器人 1 和机器人 2 将会碰撞,因为二者健康度相同,二者都将被从路线中移除。机器人 3 和机器人 4 将会碰撞,因为二者健康度相同,二者都将被从路线中移除。所以返回空数组 [] 。

提示:

1 <= positions.length == healths.length == directions.length == n <= 105
1 <= positions[i], healths[i] <= 109
directions[i] == ‘L’ 或 directions[i] == ‘R’
positions 中的所有值互不相同

向右的机器人入栈(下标、健康度),处理向左的机器人。
如果栈(用向量v1模拟,更简洁)为空,则将当前机器人,放到v2中,否则循环处理:
如果栈顶元素的健康度和当前机器人的健康度相等,出栈,循环结束。
如果小于 ⋯ \cdots ,出栈,当前机器人健康减1。机器人,至少健康1,大于说明至少2,减少1后,至少1。
如果大于,栈顶机器人健康度减少1。循环结束。
对v1 和 v2合并并排序到v3。
复制v3的健康度到结果。
注意:不能用归并排序,因为i并不是升序,pos[i]才是升序。

代码

核心代码

class Solution {
public:vector<int> survivedRobotsHealths(vector<int>& positions, vector<int>& healths, string directions) {vector<int> indexs(positions.size());iota(indexs.begin(), indexs.end(), 0);sort(indexs.begin(), indexs.end(), [&](int i1, int i2) {return positions[i1] < positions[i2]; });vector<pair<int, int>> v1, v2;for (int i : indexs) {if ('R' == directions[i]) {v1.emplace_back(pair<int, int>{ i, healths[i] }); continue;}int hea = healths[i];while (v1.size() && (hea > 0)) {if (v1.back().second == hea) {v1.pop_back();hea = -1;}else if (v1.back().second <= hea){v1.pop_back();hea--;}else {v1.back().second--;hea = -1;}}if (hea > 0) {v2.emplace_back(make_pair(i, hea));}}auto v3 = v1;v3.insert(v3.end(), v2.begin(), v2.end());sort(v3.begin(), v3.end());vector<int> ret;	for (const auto& [tmp, hea] : v3) {ret.emplace_back(hea);}return ret;}
};

单元测试

template<class T1,class T2>
void AssertEx(const T1& t1, const T2& t2)
{Assert::AreEqual(t1 , t2);
}template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{Assert::AreEqual(v1.size(), v2.size());	for (int i = 0; i < v1.size(); i++){Assert::AreEqual(v1[i], v2[i]);}
}template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{sort(vv1.begin(), vv1.end());sort(vv2.begin(), vv2.end());Assert::AreEqual(vv1.size(), vv2.size());for (int i = 0; i < vv1.size(); i++){AssertEx(vv1[i], vv2[i]);}
}namespace UnitTest
{vector<int> positions;vector<int> healths;string directions;TEST_CLASS(UnitTest){public:TEST_METHOD(TestMethod0){positions = { 5,4,3,2,1 }, healths = { 2,17,9,15,10 }, directions = "RRRRR";auto res = Solution().survivedRobotsHealths(positions, healths, directions);AssertEx({ 2,17,9,15,10 },res);}TEST_METHOD(TestMethod00){positions = { 5,4,3,2,1 }, healths = { 2,17,9,15,10 }, directions = "LLLLL";auto res = Solution().survivedRobotsHealths(positions, healths, directions);AssertEx({ 2,17,9,15,10 }, res);}TEST_METHOD(TestMethod1){positions = { 3,5,2,6 }, healths = { 10,10,15,12 }, directions = "RLRL";auto res = Solution().survivedRobotsHealths(positions, healths, directions);AssertEx({14 }, res);}TEST_METHOD(TestMethod2){positions = { 1,2,5,6 }, healths = { 10,10,11,11 }, directions = "RLRL";auto res = Solution().survivedRobotsHealths(positions, healths, directions);AssertEx({  }, res);}	};
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

MySQL-数据处理函数

026-distinct去重 select job from emp;加个 distinct 就行了 select distinct job from emp;注意&#xff1a;这个去重只是将显示的结果去重&#xff0c;原表数据不会被更改。 select 永远不会改变原数据 select distinct deptno, job from emp order by deptno asc;027-数…

步态控制之足旋转点(Foot Rotation Indicator, FRI)

足旋转点(Foot Rotation Indicator, FRI) 足旋转点是人形机器人步态规划中的一个关键概念,用于描述步态过程中机器人脚部的旋转和稳定性。FRI 可以帮助确定机器人在行走时是否稳定,以及如何调整步态以保持稳定。下面详细介绍FRI的原理,并举例说明其应用。 足旋转点(FRI…

R语言统计分析——图形的简单示例

参考资料&#xff1a;R语言实战【第2版】 1、示例一 # 绑定数据框mtcars attach(mtcars)# 打开一个图形窗口并生成一个散点图plot(wt,mpg)# 添加一条最优拟合曲线abline(lm(mpg~wt))# 添加标题title("Regression of MPG on weight") # 解除数据框绑定 detach(mtcar…

ES8.13 _bulk报错Malformed content, found extra data after parsing: START_OBJECT解决

在使用elaticsearch8.13.0使用批量创建索引时&#xff0c;根据谷粒中说的es7.9方法去批量操作请求&#xff1a; http://127.0.0.1:9200/shop/_doc/_bulk 注意1&#xff1a;设置header为Content-Type:application/x-ndjson,否则请求报错&#xff1a; {"error": &qu…

量化视频2---miniqmt的使用配置

量化视频2---miniqmt的使用配置 量化视频2---miniqmt的使用配置 (qq.com)

机器学习笔记:focal loss

1 介绍 Focal Loss 是一种在类别不平衡的情况下改善模型性能的损失函数最初在 2017 年的论文《Focal Loss for Dense Object Detection》中提出这种损失函数主要用于解决在有挑战性的对象检测任务中&#xff0c;易分类的负样本占据主导地位的问题&#xff0c;从而导致模型难以…

什么是async/await?

async/await 是 JavaScript 中处理异步操作的一种新方式&#xff0c;它使得异步代码能够以同步的方式书写&#xff0c;从而提高了代码的可读性和可维护性。 async async 是一个函数修饰符&#xff0c;用于声明一个函数是异步的。一个 async 函数总是返回一个 Promise 对象。如…

6.10 c语言

7.1 if-else语句 简化形式 if(表达式)语句块 阶梯形式 if(表达式1)语句块1 else if(表达式2&#xff09;语句块2 嵌套形式 if() if() 语句1 else 语句2 else if() 语句3 else 语句4 表达式一般情况下为逻辑表达式或关系表达式 #include <stdio.h>//从小到大排序,输出顺…

【recast-navigation-js】使用three.js辅助绘制Agent寻路路径

目录 说在前面setAgentTarget绘制寻路路径结果问题其他 说在前面 操作系统&#xff1a;windows 11浏览器&#xff1a;edge版本 124.0.2478.97recast-navigation-js版本&#xff1a;0.29.0golang版本&#xff1a;1.21.5上一篇&#xff1a;【recast-navigation-js】使用three.js辅…

linux:centos7升级libstdc++版本到3.4.26

下载&#xff0c;解压 wget http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip unzip libstdc.so_.6.0.26.zip 复制到【/usr/lib64】&#xff1a; cp libstdc.so.6.0.26 /usr/lib64创建软链接 cd /usr/lib64 sln libstdc.so.6.0.26 libstdc.so.6查看一…

Python | Leetcode Python题解之第144题二叉树的前序遍历

题目&#xff1a; 题解&#xff1a; class Solution:def preorderTraversal(self, root: TreeNode) -> List[int]:res list()if not root:return resp1 rootwhile p1:p2 p1.leftif p2:while p2.right and p2.right ! p1:p2 p2.rightif not p2.right:res.append(p1.val)…

机器学习笔记 - LoRA:大型语言模型的低秩适应

一、简述 1、模型微调 随着大型语言模型 (LLM) 的规模增加到数千亿,对这些模型进行微调成为一项挑战。传统上,要微调模型,我们需要更新所有模型参数。这也称为完全微调 (FFT) 。下图详细概述了此方法的工作原理。 完全微调FFT 的计算成本和资源需求很大,因为更新每…

数据中台、数据仓库、数据湖的区别和关联

区别 概念定义 数据中台&#xff1a;是企业级的逻辑概念&#xff0c;体现企业数据向业务价值转化的能力。它距离业务更近&#xff0c;能够更快速地响应业务和应用开发需求&#xff0c;为业务提供速度更快的服务。数据仓库&#xff1a;是为企业所有级别的决策制定过程&#xff…

初识 CAS理论

1、CAS 通过硬件保证比较-更新的原子性&#xff0c;不涉及用户态内核态的切换。 2、CAS 是 CPU 的原子指令(cmpxchg指令)&#xff0c;不会造成数据的不一致问题。Unsafe提供的 CAS 方法底层实现的是 CPU 指令cmpxchg。 3、执行cmpxchg指令&#xff0c;会判断 当前系统是否为多…

Vmess协议是什么意思? VLESS与VMess有什么区别?

VMess 是一个基于 TCP 的加密传输协议&#xff0c;所有数据使用 TCP 传输&#xff0c;是由 V2Ray 原创并使用于 V2Ray 的加密传输协议&#xff0c;它分为入站和出站两部分&#xff0c;其作用是帮助客户端跟服务器之间建立通信。在 V2Ray 上客户端与服务器的通信主要是通过 VMes…

深度学习的点云分类

深度学习的点云分类 点云分类是指将三维点云数据中的每个点或整个点云进行分类的任务。点云数据由大量三维点构成&#xff0c;每个点包含空间坐标&#xff08;x, y, z&#xff09;&#xff0c;有时还包含其他信息如颜色和法向量。点云分类在自动驾驶、机器人导航、3D重建等领域…

bitset 优化DP

bitset bitset 可以 用二进制代替0&#xff0c;1选择情况&#xff0c;也就是把固有的时间复杂度除以64或者32&#xff0c;且常数非常小&#xff0c;有些题目1e8都可以过

【InternLM实战营第二期笔记】06:Lagent AgentLego 智能体应用搭建

文章目录 讲解为什么要有智能体什么是 Agent智能体的组成智能体框架AutoGPTReWooReAct Lagent & Agent LegoAgentLego 实操Lagent Web Demo自定义工具 AgentLego&#xff1a;组装智能体“乐高”直接使用作为智能体&#xff0c;WebUI文生图测试 Agent 工具能力微调 讲解 为…

idea如何使用git reset进行回退以及如何使用git stash将暂存区文件储藏,打包后重新恢复暂存区文件

最近遇到一个棘手的问题&#xff0c;本来按照计划表开发&#xff0c;但是项目经理突然让你改一个小bug&#xff0c;改完需要马上部署到线上&#xff0c;但是你手上的活做到一半还没做完&#xff0c;提交上去那肯定是不可行的。这时就可以使用git stash命令先把当前进度&#xf…

三.四其他小组件

1、头部 2、logo组件 3、头部功能组件 4、视图组件 其他的没啥可以说的 视图数一下吧 说明白点就是 router封装的组件 <template><div:class"{ slideRight: state.slideclass.slideRight, slideLeft: state.slideclass.slideLeft , fadeInFadeOut: state.slidec…