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

文章目录

  • Walking Robot Simulation 模拟行走机器人
    • 问题描述:
    • 分析
    • 代码
    • Tag

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,整体时间复杂度 O ( N + M ∗ C l o g X ) O(N+M*ClogX) O(N+MClogX)

代码

二分

class Solution {int INF = Integer.MAX_VALUE;public int robotSim(int[] commands, int[][] obstacles) {Map<Integer,List<Integer>> mapx = new HashMap();Map<Integer,List<Integer>> mapy = new HashMap();for(int [] obs :obstacles){int x = obs[0],y = obs[1];List<Integer> xlist = mapx.getOrDefault(x,new ArrayList());List<Integer> ylist = mapy.getOrDefault(y,new ArrayList()); xlist.add(y);ylist.add(x);mapx.put(x,xlist);mapy.put(y,ylist);        }for(int k : mapx.keySet()){List<Integer> list = mapx.get(k);Collections.sort(list);mapx.put(k,list);}for(int k : mapy.keySet()){List<Integer> list = mapy.get(k);Collections.sort(list);mapy.put(k,list);}int d = 0; // directionint[][] dir = new int[][]{{0,1},{1,0},{0,-1},{-1,0}};// N,E,S,Wint n = commands.length;int idx = 0,cx = 0,cy = 0,ans=0;while(idx<n){int c = commands[idx];if(c<0){ if(c==-2) d = (d+3)%4;else d = (d+1)%4; }else{                int nx = cx+ dir[d][0]*c;int ny = cy+ dir[d][1]*c;int obs = INF;if(d%2==0){// N S if(d==0){if(mapx.containsKey(cx)){obs = find1(mapx.get(cx),cy);}if(obs!=INF&&obs<=ny){ny = obs-1;}}else{if(mapx.containsKey(cx)){ obs = find2(mapx.get(cx),cy); }if(obs!=INF&&obs>=ny){ny = obs+1;}}  }else{// E Wif(d==1){if(mapy.containsKey(cy)){obs = find1(mapy.get(cy),cx);}if(obs!=INF&&obs<=nx){nx = obs-1;}}else{if(mapy.containsKey(cy)){obs = find2(mapy.get(cy),cx);}if(obs!=INF&&obs>=nx){nx = obs+1;}} } int res = nx*nx + ny*ny;ans = Math.max(ans,res); cx = nx; cy = ny;}idx++; } return ans;    }// find first > tarpublic int find1(List<Integer> list,int tar){if(list.size()==0||list.get(list.size()-1)<tar) return INF;if(list.get(0)>tar) return list.get(0);int n = list.size();// 0~n-1int l = 0,r = n-1,mid = 0;while(l<r){mid = l+(r-l)/2;if(list.get(mid)>tar) r = mid;else l = mid+1;}return list.get(l)>tar?list.get(l):INF;}// find first < tarpublic int find2(List<Integer> list,int tar){if(list.size()==0||list.get(0)>tar) return INF;int n = list.size();if(list.get(n-1)<tar) return list.get(n-1);// 0~n-1int l = 0,r = n-1,mid = 0;while(l<r){mid = l+(r-l+1)/2;if(list.get(mid)>=tar) r = mid-1;else l = mid;} return list.get(l)<tar?list.get(l):INF;}
}

时间复杂度 O ( N + M ∗ C l o g X ) O(N+M*ClogX) O(N+MClogX)

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

Tag

Array

Simulation

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

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

相关文章

【自监督预训练 2023】MCL

【自监督预训练 2023】MCL 论文题目&#xff1a;Multi-Level Contrastive Learning for Dense Prediction Task 中文题目&#xff1a;稠密预测任务的多级对比学习 论文链接&#xff1a;https://arxiv.org/abs/2304.02010 论文代码&#xff1a;https://github.com/GuoQiushan/MC…

Unity视角拉近时物体缺失的问题处理

在Unity的开发过程中&#xff0c;我们可能会遇到以下情况&#xff1a; 就是在场景的不断编辑中&#xff0c;突然又一次打开场景&#xff0c;再拉近或拉远场景视角时&#xff0c;会出现场景中的对象会显示不全的问题。 出现了这样的情况会让场景的预览很不友好。 出现这个问题的…

rust

文章目录 rustCargoCreating a rust project How to Debug Rust Programs using VSCodebasic debuggingHow to pass arguments in Rust debugging with VS Code. References rust Cargo Cargo is a package management tool used for downloading, compiling, updating, and …

行为型模式 - 命令模式

概述 日常生活中&#xff0c;我们出去吃饭都会遇到下面的场景。 定义&#xff1a; 将一个请求封装为一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通&#xff0c;这样方便将命令对象进行存储、传递、调用、增加与管理。 结构 …

Hugging News #0717: 开源大模型榜单更新、音频 Transformers 课程完成发布!

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」。本期 Hugging News 有哪些有趣的消息&#xff0…

nacos注册中心+Ribbon负载均衡+完成openfeign的调用(超详细步骤)

目录 1.注册中心 1.1.nacos注册中心 1.2. 微服务注册和拉取注册中心的内容 2.3.修改订单微服务的代码 3.负载均衡组件 3.1.什么是负载均衡 3.2.什么是Ribbon 3.3.Ribbon 的主要作用 3.4.Ribbon提供的负载均衡策略 4.openfeign完成服务调用 4.1.什么是OpenFeign 4.2…

vscode remote-ssh配置

使用vscode的插件remote-ssh进行linux的远程控制。 在vscode上安装完remote-ssh插件后&#xff0c;还需要安装openssh-client。 openssh-client安装 先win R打开cmd&#xff0c;输入ssh&#xff0c;查看是否已经安装了。 如果没有安装&#xff0c;用管理员权限打开powershe…

Hive(25):Select高级查询之Subqueries子查询

1 from子句中子查询 在Hive0.12版本&#xff0c;仅在FROM子句中支持子查询。而且必须要给子查询一个名称&#xff0c;因为FROM子句中的每个表都必须有一个名称。 子查询返回结果中的列必须具有唯一的名称。子查询返回结果中的列在外部查询中可用&#xff0c;就像真实表的列一…

常见前端项目性能优化方案

常见前端项目性能优化方案 一、页面内容优化 减少http请求次数减少DNS查询次数避免页面跳转缓存ajax延迟加载&#xff08;一般用在图片多的页面中&#xff0c;滚动时才加载&#xff09;预加载减少DOM元素数量减少iframe数量避免404 二、css优化 将样式表置顶将 &#xff08…

Linux云服务器,docker compose文件部署多个jar,docker部署多模块boot项目

前提条件 Linux服务器 服务器已经安装docker docker已经安装jdk镜像 docker已经安装mysql镜像 将要部署的项目的jar包打包好&#xff0c;项目是多模块springboot项目 部署过程 项目是3个模块的Spring boot项目&#xff0c;打出来3个jar&#xff0c;将这些jar包拷贝到…

Linux/Unix-gcc编译回顾

1、gcc编译为可执行程序四步骤&#xff1a;预处理->编译->汇编->链接 注意&#xff1a;-o 用于修改生产的文件名 2、gcc常用参数 指定头文件&#xff1a;-I 语法&#xff1a; gcc -I 头文件所在文件夹路径 源文件 -o 生成文件名 如果头文件和源文件中同一个文件夹…

华为OD真题-流水线-带答案

题目描述&#xff1a; 一个工厂有m条流水线&#xff0c;来并行完成n个独立的作业&#xff0c;该工厂设置了一个调度系统&#xff0c;在安排作业时&#xff0c;总是优先执行处理时间最短的作业。 现给定流水线个数m&#xff0c;需要完成的作业数n, 每个作业的处理时间分别为t1,t…

阿里云OSS迁移工具ossimport实战心得

前言 由于业务的增长&#xff0c;传统的基于磁盘的文件存储需要迁移到阿里云OSS对象存储中。我们的业务主要是涉及GPS轨迹小文件&#xff0c;大致有1TB&#xff0c;文件数量5千万。在使用阿里云ossimport工具的过程中有些基本概念不明确&#xff0c;导致了一些操作失误&#xf…

性能测试 Linux 环境下模拟延时和丢包实现

在性能测试过程中&#xff0c;我们还需要模拟网络异常的情况下&#xff0c;是否会出现一些异常数据。最常见的就是写库操作&#xff0c;比如说我们下单的场景&#xff0c;如果出现网络异常的时候是否会出现数据对不上这种情况。 如我们JMeter发送成功的请求数量和最终数据库表…

linux之Ubuntu系列(五)用户管理、查看用户信息 终端命令

创建用户 、删除用户、修改其他用户密码的终端命令都需要通过 sudo 执行 创建用户 设置密码 删除用户 sudo useradd -m -g 组名 新建用户名 添加新用户 -m&#xff1a;自动建立用户 家目录 -g&#xff1a;指定用户所在的组。否则会建立一个和用户同名的组 设置新增用户的密码&…

Git源代码管理方案

背景 现阶段的Git源代码管理上有一些漏洞&#xff0c;导致在每次上线发布的时间长、出问题&#xff0c;对整体产品的进度有一定的影响。 作用 新的Git源代码管理方案有以下作用&#xff1a; 多功能并行开发时&#xff0c;测试人员可以根据需求任务分配测试自己的功能&#…

Ceph 分布式存储之应用

一、创建 CephFS 文件系统 MDS 接口 1、服务端操作 1&#xff09;在管理节点创建 mds 服务 [rootadmin ceph]# cd /etc/ceph [rootadmin ceph]# ceph-deploy mds create node01 node02 node03 [ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.c…

.Net5 mvc项目UseBrowserLink插件功能失效的原因

前期基于.Net Framework创建的Web项目&#xff0c;使用了BrowserLink插件协助前端开发&#xff0c;功能一直都比较稳定&#xff0c;后来项目迁到.Net5 &#xff0c;发现BrowserLink 已经失去了从浏览器定位到项目源代码的功能&#xff0c;希望在后面的版本还能继续支持此版本&a…

Velocity如何对变量中的引号特殊字符进行转义

简介 Velocity是一个基于Java的模板引擎&#xff0c;与Freemarker类似。相较于Freemarker更轻量&#xff0c;但带来的问题就是功能不如Freemarker强大&#xff0c;所以实际项目中可能会更倾向于用Freemarker&#xff0c;这里不作过多介绍了&#xff0c;本文主要记录一下在使用…

国内流行的数据可视化软件工具

在信息爆炸的时代&#xff0c;越来越多的数据堆积如山。但是&#xff0c;这些密集的数据没有重点且可读性较差。因此&#xff0c;我们需要数据可视化来帮助数据易于理解和接受。相比之下&#xff0c;可视化更直观、更有意义&#xff0c;使用适当的数据可视化工具来可视化数据非…