​LeetCode解法汇总874. 模拟行走机器人

news/2023/12/1 12:28:20

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

机器人在一个无限大小的 XY 网格平面上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令 commands :

  • -2 :向左转 90 度
  • -1 :向右转 90 度
  • 1 <= x <= 9 :向前移动 x 个单位长度

在网格上有一些格子被视为障碍物 obstacles 。第 i 个障碍物位于网格点  obstacles[i] = (xi, yi) 。

机器人无法走到障碍物上,它将会停留在障碍物的前一个网格方块上,但仍然可以继续尝试进行该路线的其余部分。

返回从原点到机器人所有经过的路径点(坐标为整数)的最大欧式距离的平方。(即,如果距离为 5 ,则返回 25 )

注意:

  • 北表示 +Y 方向。
  • 东表示 +X 方向。
  • 南表示 -Y 方向。
  • 西表示 -X 方向。

示例 1:

输入:commands = [4,-1,3], obstacles = []
输出:25
解释:
机器人开始位于 (0, 0):
1. 向北移动 4 个单位,到达 (0, 4)
2. 右转
3. 向东移动 3 个单位,到达 (3, 4)
距离原点最远的是 (3, 4) ,距离为 32 + 42 = 25

示例 2:

输入:commands = [4,-1,4,-2,4], obstacles = [[2,4]]
输出:65
解释:机器人开始位于 (0, 0):
1. 向北移动 4 个单位,到达 (0, 4)
2. 右转
3. 向东移动 1 个单位,然后被位于 (2, 4) 的障碍物阻挡,机器人停在 (1, 4)
4. 左转
5. 向北走 4 个单位,到达 (1, 8)
距离原点最远的是 (1, 8) ,距离为 12 + 82 = 65

提示:

  • 1 <= commands.length <= 104
  • commands[i] is one of the values in the list [-2,-1,1,2,3,4,5,6,7,8,9].
  • 0 <= obstacles.length <= 104
  • -3 * 104 <= xi, yi <= 3 * 104
  • 答案保证小于 231

解题思路:

* 874. 模拟行走机器人

* -2:左转90

* -1:右转90

* 1<=x<=9,移动长度

* 解题思路:

* 首先我们看范围,1 <= commands.length <= 10^4,0 <= obstacles.length <= 10^4。

* 则肯定不能是n*m的复杂度,否则时间会超过。

* 但是commands的遍历肯定是要的,所以我们就想办法解决obstacles,把其变为一个O(1)或者O(lgn)复杂度的查询。

* obstacles按照x轴和y轴分为两个map,key为x或者y坐标,value为这个坐标轴上所有的点,然后进行排序。

* 遍历commands的时候,方向自然不用说,如果遇到了前进或者后退,则判断当前轴距离原点最近的点长度,如果大于command则移动command,否则移动最近长度。

代码:

class Solution874
{
public:/*** 找出比tartget找到有序集合中,比目标值相等或者大的* 或者* 找到有序集合中,比目标值相等或者小的*/int findIndex(vector<int> *list, int target, bool isBigger){int left = 0;int right = list->size() - 1;int middle;int abs = isBigger ? right + 1 : left - 1;while (left <= right){middle = (left + right) / 2;if (isBigger){if ((*list)[middle] > target){right = middle - 1;abs = middle;}else{left = middle + 1;}}else{if ((*list)[middle] < target){abs = middle;left = middle + 1;}else{right = middle - 1;}}}return abs;}/*** forward 方向,加或者减* value   前进值* from    起始值*/void takeStep(map<int, vector<int>> &xMap, map<int, vector<int>> &yMap, int &x, int &y, int forward, int step){vector<int> *list;int from = 0;int *updateValue;bool isAdd = forward <= 1;if (forward == 0 || forward == 2){from = y;if (yMap.find(x) == yMap.end()){y = y + (forward == 0 ? step : step * -1);return;}updateValue = &y;list = &(yMap[x]);}else if (forward == 1 || forward == 3){from = x;if (xMap.find(y) == xMap.end()){x = x + (forward == 1 ? step : step * -1);return;}updateValue = &x;list = &(xMap[y]);}int index = findIndex(list, from, isAdd);if (index == -1 || index == list->size()){*updateValue = from + (isAdd ? step : step * -1);return;}// int expect = from + (isAdd ? step : step * -1);//int canMove = abs((*list)[index] - from) - 1;if (step > canMove){*updateValue = from + (isAdd ? canMove : canMove * -1);}else{*updateValue = from + (isAdd ? step : step * -1);}}int correctForward(int forward){if (forward < 0){return 3;}if (forward > 3){return 0;}return forward;}int robotSim(vector<int> &commands, vector<vector<int>> &obstacles){map<int, vector<int>> xMap;map<int, vector<int>> yMap;for (vector<int> v : obstacles){int x = v[0];int y = v[1];if (xMap.find(y) == xMap.end()){xMap[y] = vector<int>();}xMap[y].push_back(x);if (yMap.find(x) == yMap.end()){yMap[x] = vector<int>();}yMap[x].push_back(y);}int max = 0;// 排序for (auto at = xMap.begin(); at != xMap.end(); at++){std::vector<int> &value = at->second;sort(value.begin(), value.end());}for (auto at = yMap.begin(); at != yMap.end(); at++){std::vector<int> &value = at->second;sort(value.begin(), value.end());}int forward = 0;int x = 0;int y = 0;for (int i = 0; i < commands.size(); i++){int command = commands[i];if (command == -2){forward = correctForward(forward - 1);}else if (command == -1){forward = correctForward(forward + 1);}else{takeStep(xMap, yMap, x, y, forward, command);}cout << "command:" << command << ",forward:" << forward << ",x:" << x << ",y:" << y << ",value:" << (x * x + y * y) << endl;max = std::max(max, x * x + y * y);}return max;}
};


http://www.ppmy.cn/news/955642.html

相关文章

众人围剿,GPT-5招惹了谁

目录 千人呼吁暂停AI训练代表人物分析反对原因分析信息安全人身安全失业利益 总结 GPT-4 火爆全球&#xff0c;引发了人工智能大浪潮。过去的一个月&#xff0c;OpenAI、微软、谷歌加上百度不断释放王炸&#xff0c;所有人都相信&#xff0c;AI 的就是未来的生产力。俗话说&…

​男子用ChatGPT编假新闻被采取刑事强制措施;苹果M3芯片下半年量产;Safari超Edge,成第二大桌面浏览器|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

45岁当打之年再创业,剑指中国版ChatGPT,这位美团联合创始人能否圆梦?

文 BFT机器人 “即便只有一个人&#xff0c;我也要出发。” 这是45岁的前美团联合创始人王慧文再次冲上创业沙场的“征战”宣言&#xff0c;这一次他的梦想是“组队拥抱新时代&#xff0c;打造中国OpenAI”。 01 当打之年&#xff0c; AI新梦再起航 “我的人工智能宣言&…

chatEverything的一些思考

今天微软正式宣告开始ToC的商用了 关于写代码被取代的事情&#xff0c;以及电脑有自主意识的听懂复杂的命令自动计算、出图、操作&#xff0c;这件事从我接触IT课程开始&#xff0c;就觉得一定很快会实现&#xff0c;程序员终究也会从流水线上被替代&#xff0c;真正留下的还是…

用gpt4来读和君书单(1) - 热身序曲:悦读 21本

用gpt4来读和君书单(1) - 热身序曲&#xff1a;悦读 21本 快速阅读 Efficient Reading 《快速阅读》&#xff08;Efficient Reading&#xff09;是一本由克里斯蒂安格吕宁&#xff08;Christian Grning&#xff09;撰写的关于提高阅读效率和理解能力的书籍。虽然这本书目前没有…

【鸡汤里面的干货】农村娃娃毕业不到四年在深圳核心地段安家置业的背后是什么在支撑?

大家好啊&#xff0c;我就是那个【天涯何处无知己&#xff0c;人穷陌路勿担忧】的架构师李肯&#xff01; 架构师李肯&#xff08;全网同名&#xff09; 在深圳白手起家&#xff0c;毕业不到4年实现一线城市核心地段的安家梦&#xff0c;从0开始谱写励志人生&#xff01;一个专…

一天现六个国产ChatGPT大模型,“百模大战”全面开打

&#xff08;图片来源&#xff1a;Shutterstock&#xff09; 国内人工智能&#xff08;AI&#xff09;大模型行业到底有多火&#xff1f;你看看下面消息就知道了。 仅4月18日一天&#xff0c;就有6个关于大模型的重要消息公布&#xff1a; 钉钉宣布正式接入阿里巴巴“通义千问…

ChatGPT与教育系列(一、ChatGPT)

未来已来&#xff0c;拥抱变化&#xff0c;拥抱未来 一、ChatGPT 1、ChatGPT定义 ChatGPT&#xff08;Chat Generative Pre-trained Transformer&#xff09;翻译成&#xff1a;聊天生成式预训练转换器&#xff0c;其中&#xff0c;“Chat Generative”表示聊天生成式&#x…

涂鸦智能冲刺IPO,不卖硬件的AIoT公司,团队阿里云出身,腾讯是大股东

晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 一家创始团队来自阿里&#xff0c;却被腾讯持股10.8%的公司&#xff0c;这周要上市了。 近日&#xff0c;IoT公司涂鸦智能向美国SEC提交了更新后的招股书&#xff0c;计划3月19日在纽交所挂牌。 招股书显示&#xff0c;涂鸦智能发…

有道周枫谈ChatGPT:让Transformer在智能硬件里更高效运行

雷递网 乐天 2月23日 教育科技公司网易有道&#xff08;NYSE&#xff1a;DAO&#xff09;今日公布2022年第四季度及2022财年未经审计财务报告。财报显示&#xff0c;网易有道2022年四季度净收入达到14.5亿元&#xff0c;同比增长38.6%&#xff0c;首次实现单季度经营利润为正。…

GPT-4老板称害怕ChatGPT/ 李彦宏:文心一言符合预期/ 马斯克欠账不还…今日更多新鲜事在此...

日报君 发自 凹非寺量子位 | 公众号 QbitAI 大家好&#xff0c;今天是3月20日星期一&#xff0c;又是元气满满的一周。 经历了上一周GPT-4带来的疯狂&#xff0c;科技圈又发生了哪些新鲜事&#xff0c;一起来和日报君看看&#xff5e; 李彦宏回应外界对文心一言反馈 这两天&…

chatGPT衣食住行10种场景系列教程(01)chatGPT热点事件+开发利器

导读 时隔5个多月&#xff0c;chatGPT可谓是一日千里&#xff0c;越演越火&#xff0c;携带着AIGC行业一起飞了起来&#xff0c;那么在短短5个月当中有那些值得我们关注的事件&#xff1f;有那些好玩的场景&#xff1f;以及有那些chatGPT好用的工具&#xff1f;本文都将一一告…

一个 ChatGPT,还能养活多少 AI 新老板?

内容一览&#xff1a;当下&#xff0c;国内 AI 创业十分火爆&#xff0c;截止目前加入这个阵营的已有贾扬清等多位明星创业者。然而&#xff0c;这次 ChatGPT 的出现能否打破国内 AI 公司缺少规模化落地的创业「魔咒」&#xff1f; 本文首发自 HyperAI超神经微信公众号~ 刚刚过…

STM32 HAL库定时器输入捕获SlaveMode脉宽测量

STM32 HAL库定时器输入捕获SlaveMode脉宽测量 SlaveMode模式简介 ✨SlaveMode复位模式&#xff1a;在发生一个触发输入事件时&#xff0c;计数器和它的预分频器能够重新被初始化&#xff1b;同时&#xff0c;如果TIMx_CR1寄存器的URS位为低&#xff0c;还会产生一个更新事件UEV…

ChatGPT 将成“天选打工人”?OpenAI CEO:对发明“有点害怕”

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 自 ChatGPT 横空出世以来&#xff0c;可谓是“香饽饽”一样的存在&#xff0c;但也让其陷入“取代人类、导致失业”的舆论风波中。 毕竟&#xff0c;这位“新天选打工人”似乎可以拿捏住…

如何用乐高积木式操作让 ChatGPT 变得更强大?

需求 这些日子&#xff0c;很多小伙伴儿玩儿 ChatGPT 不亦乐乎&#xff0c;甚至陷入了沉迷。 他们尝试了各种 ChatGPT 的功能。不少功能强悍到不可思议&#xff1b;当然&#xff0c;也有些功能尝试因遇到障碍无法完成。于是很多用户非常失望&#xff0c;觉得 ChatGPT 好像啥都干…

提问的艺术:如何通过提示词让 ChatGPT 更准确地理解你的问题?

在当今的信息时代&#xff0c;人工智能语言模型如 ChatGPT 为我们提供了一个强大的知识库和解决问题的工具。为了更好地使用 ChatGPT&#xff0c;非常有必要学习提示词工程。通过熟练地使用提示词&#xff0c;我们能够让AI更加准确地理解我们想要表达的意思&#xff0c;从而更高…

ChatGPT 高效使用指南

简介 ChatGPT 是一种基于人工智能&#xff08;AI&#xff09;技术的应用&#xff0c;它可以通过文字和使用者进行对话和回答问题。它采用的人工神经网络和深度学习等技术&#xff0c;能够学习大量的语言数据&#xff0c;并从中提取出语言规律和模式&#xff0c;从而生成具有逻…

ChatGPT发明「史莱姆语」,词汇语法规则全都有,还配了「史翻英」Python代码

羿阁 鱼羊 发自 凹非寺量子位 | 公众号 QbitAI 好家伙&#xff0c;ChatGPT都能发明语言了&#xff1f;&#xff1f;&#xff1f; 还不仅仅是对英文词汇搞些简单替换&#xff0c;什么从句、语法格之类的语法规则&#xff0c;也都弄得明明白白。 没错&#xff0c;现在&#xff0c…

Leetcode每日一题(简单):415. 字符串相加(2023.7.17 C++)

目录 415. 字符串相加 题目描述&#xff1a; 实现代码与解析&#xff1a; 模拟加法 原理思路&#xff1a; 简洁代码 415. 字符串相加 题目描述&#xff1a; 给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 你不能使用任何…
最新文章