【LeetCode 算法】Walking Robot Simulation 模拟行走机器人 - 哈希

文章目录

  • Walking Robot Simulation 模拟行走机器人

Walking Robot Simulation 模拟行走机器人

问题描述:

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

-2 :向左转 90 度
-1 :向右转 90 度
1 < = x < = 9 1 <= x <= 9 1<=x<=9 :向前移动 x 个单位长度
在网格上有一些格子被视为障碍物 obstacles 。第 i 个障碍物位于网格点 o b s t a c l e s [ i ] = ( x i , y i ) obstacles[i] = (x_i, y_i) obstacles[i]=(xi,yi)

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

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

1 < = c o m m a n d s . l e n g t h < = 1 0 4 c o m m a n d s [ i ] i s o n e o f t h e v a l u e s i n t h e l i s t [ − 2 , − 1 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] 0 < = o b s t a c l e s . l e n g t h < = 1 0 4 − 3 ∗ 1 0 4 < = x i , y i < = 3 ∗ 1 0 4 答案保证小于 2 31 1 <= commands.length <= 10^4\\ commands[i] is one of the values in the list [-2,-1,1,2,3,4,5,6,7,8,9]\\ 0 <= obstacles.length <= 10^4\\ -3 * 10^4 <= xi, yi <= 3 * 10^4\\ 答案保证小于 2^{31} 1<=commands.length<=104commands[i]isoneofthevaluesinthelist[2,1,1,2,3,4,5,6,7,8,9]0<=obstacles.length<=1043104<=xi,yi<=3104答案保证小于231

分析

模拟问题属于看上去很简单,但是做起来处处是坑。

这个问题中,可以移动的范围可以看做是一个二维直角坐标系。起始点是原点[0,0],这个移动范围是不受边界限制的,它不同于一般的矩阵,有行列大小限制

唯一受到的限制就是obstacle,而且移动的方向是4向,上下左右。

最简单的方式,就是在每次移动时确定要移动的方向,然后移动C步,每移动一步,需要判断是否遇到obstacle,如果遇到,就需要在obstacle之前停止

如果是普通的判断坐标是否是obstacle,就需要遍历O(N)的长度,而command的次数是 1 0 4 10^4 104,所以整体来看,这个算法很可能TLE.

所以需要在某个环节进行加速,很明显只能在判断的环节,进行加速。

加速的方式有几种,目标就是缩短判断的时间复杂度,最常见的就是HashMap。

移动的过程中一定是有x或者y保持不变,

只要每次判断移动的nx,ny是否是obstacle,所以时间复杂度基本可以达到O(1).
当然预处理hashmap 的时间复杂度也大概需要 O ( N ) O(N) O(N),整体的时间复杂度 O ( N + M ∗ C ) O(N+M*C) O(N+MC).

代码

哈希

public int robotSim(int[] commands, int[][] obstacles) {int[][] dirs = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};int px = 0, py = 0, d = 1;Set<Integer> set = new HashSet<Integer>();for (int[] obstacle : obstacles) {set.add(obstacle[0] * 60001 + obstacle[1]);}int res = 0;for (int c : commands) {if (c < 0) {d += c == -1 ? 1 : -1;d %= 4;if (d < 0) {d += 4;}} else {for (int i = 0; i < c; i++) {if (set.contains((px + dirs[d][0]) * 60001 + py + dirs[d][1])) {break;}px += dirs[d][0];py += dirs[d][1];res = Math.max(res, px * px + py * py);}}}return res;}

时间复杂度 O ( N + M ∗ C ) O(N+M*C) O(N+MC)

空间复杂度 O ( M ) O(M) O(M)

Tag

Array

Simulation

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

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

相关文章

opencv-06 使用numpy.array 操作图片像素值

opencv-06 使用numpy.array 操作图片像素值 **1&#xff0e;二值图像及灰度图像****利用item 读取某一个像素值****利用itemset 修改像素值****彩色图像numpy.arry 像素值操作** numpy.array 提供了 item()和 itemset()函数来访问和修改像素值&#xff0c;而且这两个函数都是经…

基于MATLAB的无人机遥感数据预处理与农林植被性状估算

查看原文>>>基于MATLAB的无人机遥感数据预处理与农林植被性状估算 在新一轮互联网信息技术大发展的现今&#xff0c;无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节…

Offset Explorer2 监视kafka的利器

kafka作为一个生产者和消费者集为一体的框架&#xff0c;消费者必须一直保持打开的状态&#xff0c;并且每隔一段时间接收一次数据&#xff0c;才能够保持生产者放入的数据及时被处理掉&#xff0c;而生产者则可以每隔一段时间发送一波数据&#xff0c;这样消费者就能够接收到了…

layui入门增删改查

layui入门增删改查 创建Lauiyi对象1.后台准备1.dao方法2.子实现类 2.R工具类的使用3.查询前端代码实现前端页面 4.增删改实现2.浮层3分离的js代码1.userManage.js2.userEdit.js3.index.js 5.运行效果 作为一名开发人员&#xff0c;我们经常需要对数据库中的数据进行增删改查&am…

前端node.js入门

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 Node.js 入门 什么是 Node.js&#xff1f; 什么是前端工程化&#xff1f; Node.js 为何能执行 JS&…

kafka无消息丢失配置

目录 前言&#xff1a; 消息丢失的场景 生产者消息丢失 Broker消息丢失 消费者消息丢失 消息丢失问题排查 无消息丢失配置&#xff1a; 参考资料&#xff1a; 前言&#xff1a; 使用消息中间件时&#xff0c;我们遇到最头疼的事就消息丢失&#xff0c;小则影响程序错误&…

【数据结构】二叉树详解(2)

⭐️ 前言 ✨ 往期文章链接&#xff1a;二叉树的概念性质 上一篇我们讲了二叉树的结构定义&#xff0c;以及前序/中序/后序的递归遍历&#xff0c;还有一些二叉树的接口实现&#xff0c;本篇我们补充一个二叉树的接口 BinaryTreeDepth。✨上一篇文章链接&#xff1a;二叉树详…

【C++】命名空间、缺省参数和函数重载

文章目录 一、命名空间1.命名空间定义2.命名空间使用 二、缺省参数1.分类2.其他注意事项 三、函数重载总结 一、命名空间 在一个大型的项目中&#xff0c;不同成员写的程序中会不可避免的带来命名冲突的问题&#xff0c;这种情况下命名空间可以很好的解决这种命名冲突大的问题…

java面试真题【上册】

tips&#xff1a;下面简述题为java面试真题&#xff0c;阅读本文且感兴趣的&#xff0c;还有将要面试的小伙伴有条件的准备一下笔和纸&#xff0c;将之转述出来成为自己的知识&#xff0c;希望接下来的面试好运连连 目录 1.Java中的四种访问权限分别是什么&#xff1f;它们分…

结合ChatGPT制作PPT

今天看到圈友的一个AI分享&#xff0c;然后自己本身需要做一个分享的PPT。刚好那着帖子实战一下。先说下整体感受。 优点&#xff1a;制作成本确实会比较低&#xff0c;很熟练的话大概就是1分钟一个都有可能。整体流程是先找个第三方PPT制作网站&#xff0c;看下支不支持文本转…

UE5【C++】 UPROPERTY和UFUNCTION介绍

文章目录 UPROPERTY介绍常见属性说明符使用示例 UFUNCTION介绍常见属性说明符使用示例 虚幻四种基本继承关系和组件的概念Actor和组件的关系RootComponent的作用组件的分类组件的使用UActorComponent的作用TickingUSceneComponentUPrimitiveComponent UPROPERTY介绍 属性使用标…

PLEX如何搭建个人局域网的视频网站

Plex是一款功能非常强大的影音媒体管理系统&#xff0c;最大的优势是多平台支持和界面优美&#xff0c;几乎可以在所有的平台上安装plex服务器和客户端&#xff0c;让你可以随时随地享受存储在家中的电影、照片、音乐&#xff0c;并且可以实现观看记录无缝衔接&#xff0c;手机…

opencv-14 图像加密和解密

在OpenCV中&#xff0c;图像加密和解密是通过对图像像素进行一系列的变换和操作来实现的 通过按位异或运算可以实现图像的加密和解密。 通过对原始图像与密钥图像进行按位异或&#xff0c;可以实现加密&#xff1b;将加密后的图像与密钥图像再次进行按位异或&#xff0c;可以实…

实例019 以图形按钮显示的界面

实例说明 菜单和工具栏虽然能方便用户操作程序的相应功能&#xff0c;但各有缺点。如果采用按钮式功能菜单&#xff0c;不但美观大方&#xff0c;而且操作灵活。当单击按钮时&#xff0c;用户区将显示相应的操作按钮组。下面介绍图形界面式菜单的设计方法。运行本例&#xff0…

【贪心算法Part03】| 1005.K次取反后最大化的数组和、134.加油站、135.分发糖果

目录 &#x1f388;LeetCode1005.K次取反后最大化的数组和 &#x1f388;LeetCode134.加油站 &#x1f388;LeetCode135.分发糖果 &#x1f388;LeetCode1005.K次取反后最大化的数组和 链接&#xff1a;1005.K次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k…

学习背景和学习规划

为什么要学习大数据相关的技术&#xff1f; 随着工作年限的增加&#xff0c;JAVA已经陪伴我五年有余了&#xff0c;这些年的工作中我能够明显感觉到一些web开发领域的变化。刚开始工作时公司做的项目大多是一些功能单一、用户量极少的web应用&#xff0c;这种项目对技术和性能的…

分享一个唯美雪花界面

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>雪</title><meta name"viewport" content"widthdevice-width, initial-scale1&…

TKDE论文,跑的改的,GPSCVULDETECTOR

Combining Graph Neural Networks With Expert Knowledge for Smart Contract Vulnerability Detection 论文代码GitHub https://github.com/Messi-Q/GPSCVulDetectorpaper https://ieeexplore.ieee.org/abstract/document/9477066/参考IJCAI 21中AME的数据集 https://gith…

中国地图使用心得

中国地图使用心得 注册地图是注册在echarts对象上而非 自己构建的echarts dom上、。 请求本地json文件 ​ vue项目的public打包时不会动&#xff0c;所以线上和本地地址直接指向了public同级目录&#xff0c;请求时直接相对路径 绘制中国地图时&#xff0c;如何在各个省会地方…

旅游卡系统加盟代理软件开发

旅游行业的不断发展&#xff0c;越来越多的旅行社开始推出各种优惠卡来吸引游客。而随着智能手机的普及&#xff0c;开发一款旅行社优惠卡APP软件成为了一种必然的趋势。 该软件的主要功能是提供旅行社的各种优惠卡信息&#xff0c;包括优惠卡的种类、价格、使用范围、有效…