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

目录链接:

力扣编程题-解法汇总_分享+记录-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.mzph.cn/news/3157.shtml

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

相关文章

ENSP实验四:搭建VPN(GRE,配置安全策略)

首先分析一下数据的流向&#xff1a; PC1->PC2 1、FW1&#xff1a;trust->dmz 【192.168.1.1->192.168.2.1 ICMP】 2、AR1->AR2&#xff1a;【202.1.1.1->202.1.3.1|GRE|192.168.1.1->192.168.2.1 icmp】 3、FW2&#xff1a; ①untrust->local …

kotlin中使用Room数据库(包含升降级崩溃处理)

目录 1.导入依赖库 2.数据实体类 3.数据访问对象 (DAO) 4.数据库类 5.调用DAO里面的“增、删、改、查”方法 6.数据库升降级处理 升级&#xff08;保存数据库历史数据&#xff09;&#xff1a; 升级&#xff08;不保存数据库历史数据&#xff09;&#xff1a; 降级&…

SpringCloud学习路线(1)—— 从头开始的微服务

一、服务架构的历史 现有的服务框架&#xff1a; 单体架构 概念&#xff1a; 将业务所有功能集中在一个项目中开发&#xff0c;打包部署优点&#xff1a; 架构简单&#xff0c;部署成本低缺陷&#xff1a; 耦合度高 分布式架构 概念&#xff1a; 根据业务功能对系统进行拆分&a…

了解 3DS MAX 3D摄像机跟踪设置:第 7 部分

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 在SynthEyes中跟踪素材 步骤 1 打开SynthEyes软件。 打开合成之眼 步骤 2 在跟踪素材之前&#xff0c;您需要设置首选项。因为&#xff0c;你 稍后将在 3ds Max 中工作&#xff0c;必须根据 3ds Max…

【源码解析】Mybatis执行原理

Mybatis执行原理 1.获取SqlSessionFactory2.创建SqlSession3.创建Mapper、执行SQL MyBatis 是一款优秀的持久层框架&#xff0c;MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将接口和…

elasticsearch学习入门+实战

学习链接1 基础概念 官网学习&#xff1a;地址 基本命令 PS&#xff1a;使用Apifox测试 查询所有索引库 添加索引库 添加时&#xff0c;加入分词器 添加时&#xff0c;加入记录属性值 查询获取索引库 删除索引库 添加文档 必须要在添加文档值的时候用【_doc】&a…

如何在 Excel 中快速生成随机密码?

有时&#xff0c;我们可能想创建随机密码来保护某些重要内容。 但是&#xff0c;您有什么技巧可以在Excel中快速生成随机密码&#xff1f; 在这里&#xff0c;我有一些可以在Excel工作表中处理的方法。 用公式生成随机密码 使用插入随机数据生成随机密码​编辑 用公式生成随机…

IPD跟敏捷、DevOps一样吗?有什么区别?

1992年在激烈的全球市场竞争下&#xff0c;IBM遭遇到了严重的财政困难&#xff0c;公司销售收入停止增长&#xff0c;利润急剧下降。经过内部分析&#xff0c;IBM发现他们在研发费用、研发损失费用和产品上市时间等几个方面远远落后于业界最佳。为了重新获得市场竞争优势&#…

思维决定发展,测试人也不例外

最近特别懒&#xff0c;不想码字&#xff0c;原本写作就很差&#xff0c;更是退化严重。社招和校招面试过很多人&#xff0c;从十年前自己还很弱的时候学着面试&#xff0c;到数百次面试积累之后&#xff0c;面对候选人的时候&#xff0c;我的内心依然有些许紧张&#xff0c;非…

初识protobuf

Protobuf 全称Protocol Buffers&#xff08;协议缓冲区&#xff09;&#xff0c;是一种轻量级、高效的数据序列化格式&#xff0c;由Google开发。它被设计用于结构化数据的序列化、反序列化以及数据交换&#xff0c;常用于网络通信和数据存储等领域。 Protobuf使用简洁的消息描…

高效又安全的企业大数据传输解决方案推荐

在当前的商业领域中&#xff0c;企业大数据传输是一个重要而复杂的问题。随着企业规模和数据量的扩大&#xff0c;如何安全可靠、高效快速地传输大数据成为了许多企业需要面对的挑战。本文将介绍几种值得考虑的企业大数据传输解决方案&#xff0c;以帮助企业有效应对这一挑战。…

【产品设计】微信小程序如何做好“授权”设计?

授权登录降低了用户注册账号时的操作成本&#xff0c;减少了产品的获客门槛。在本文中&#xff0c;作者结合案例&#xff0c;盘点了微信小程序授权登录设计中需要注意的几点问题&#xff0c;并对功能设计背后的设计思路与原理进行了简要的分析 01 openID 这是微信生态圈中&…

ROS:动态参数

目录 一、前言二、概念三、作用四、实际用例4.1需求4.2客户端4.2.1流程4.2.2新建功能包4.2.3添加.cfg文件4.2.4配置 CMakeLists.txt4.2.5编译 4.3服务端(C)4.3.1流程4.3.2vscode配置4.3.3服务器代码实现4.3.4编译配置文件4.3.5执行 4.4服务端(Python)4.4.1流程4.4.2vscode配置4…

EasyCVR视频融合平台能正常播放其他协议流,但无法播放HLS流的原因排查

EasyCVR基于云边端一体化架构&#xff0c;支持海量视频汇聚管理&#xff0c;平台支持多协议与多类型设备接入&#xff0c;具体包括国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等&#xff0c;能对外分发RTMP、RTSP、HTTP-FLV、WS-FLV、HLS、WebRTC等。…

Python 和 RabbitMQ 进行消息传递和处理

一、RabbitMQ 简介 RabbitMQ 是一个开源的消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;标准。它的官方客户端提供了多种编程语言的接口&#xff0c;包括 Python、Java 和 Ruby 等。它支持消息的持久化、多种交换机类型、消息通知机制、灵活…

【Leetcode】687.最长同值路径

一、题目 1、题目描述 给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。 两个节点之间的路径长度 由它们之间的边数表示。 示例1: 输入:root = [5,4,5,1,1,5] 输出:2示例2: 输入:root …

MySQL数据库与表的基本操作 + 表的基本CRUD(增删改查)操作

文章目录 前言一、库的基本操作显示当前所有数据库创建数据库使用数据库删除数据库 二、表的基本操作创建表查看库中所有表查看表结构删除表 三、表的增删改查(基础)新增数据(Create)全列插入指定列插入 查询数据(Retrieve)全列查询指定列查询查询字段为表达式指定列的别名去重…

【Kubernetes运维篇】RBAC之准入控制器详解

文章目录 一、ResourceQuota准入控制器1、ResourceQuota是什么&#xff1f;2、限制CPU、内存、Pod数量、Deployment数量3、限制存储空间大小 二、LimitRanger准入控制器1、LimitRanger是什么&#xff1f;2、LimitRanger限制案例 一、ResourceQuota准入控制器 中文官方参考文档…

scrapy

scrapy介绍安装--架构 Scrapy 是一个爬虫框架&#xff08;底层代码封装好了&#xff0c;只需要在固定位置写固定代码即可&#xff09;&#xff0c;应用领域比较广泛---》爬虫界的django# 安装 #Windows平台1、pip3 install wheel #安装后&#xff0c;便支持通过wheel文件安装软…

c#调用cpp库,debug时不进入cpp函数

选中c#的项目&#xff0c;右击属性&#xff0c;进入属性页&#xff0c;点击调试&#xff0c;点击打开调试启动配置文件UI&#xff0c;打开启用本机代码调试。