LeetCode 2120.执行所有后缀指令

现有一个 n x n 大小的网格,左上角单元格坐标 (0, 0) ,右下角单元格坐标 (n - 1, n - 1) 。给你整数 n 和一个整数数组 startPos ,其中 startPos = [startrow, startcol] 表示机器人最开始在坐标为 (startrow, startcol) 的单元格上。

另给你一个长度为 m 、下标从 0 开始的字符串 s ,其中 s[i] 是对机器人的第 i 条指令:‘L’(向左移动),‘R’(向右移动),‘U’(向上移动)和 ‘D’(向下移动)。

机器人可以从 s 中的任一第 i 条指令开始执行。它将会逐条执行指令直到 s 的末尾,但在满足下述条件之一时,机器人将会停止:

下一条指令将会导致机器人移动到网格外。
没有指令可以执行。
返回一个长度为 m 的数组 answer ,其中 answer[i] 是机器人从第 i 条指令 开始 ,可以执行的 指令数目 。

示例 1:
在这里插入图片描述

输入:n = 3, startPos = [0,1], s = “RRDDLU”
输出:[1,5,4,3,1,0]
解释:机器人从 startPos 出发,并从第 i 条指令开始执行:

  • 0: “RRDDLU” 在移动到网格外之前,只能执行一条 “R” 指令。
  • 1: “RDDLU” 可以执行全部五条指令,机器人仍在网格内,最终到达 (0, 0) 。
  • 2: “DDLU” 可以执行全部四条指令,机器人仍在网格内,最终到达 (0, 0) 。
  • 3: “DLU” 可以执行全部三条指令,机器人仍在网格内,最终到达 (0, 0) 。
  • 4: “LU” 在移动到网格外之前,只能执行一条 “L” 指令。
  • 5: “U” 如果向上移动,将会移动到网格外。
    示例 2:

在这里插入图片描述

输入:n = 2, startPos = [1,1], s = “LURD”
输出:[4,1,0,0]
解释:

  • 0: “LURD”
  • 1: “URD”
  • 2: “RD”
  • 3: “D”
    示例 3:

在这里插入图片描述

输入:n = 1, startPos = [0,0], s = “LRUD”
输出:[0,0,0,0]
解释:无论机器人从哪条指令开始执行,都会移动到网格外。

提示:

m == s.length
1 <= n, m <= 500
startPos.length == 2
0 <= startrow, startcol < n
s 由 ‘L’、‘R’、‘U’ 和 ‘D’ 组成

法一:直接模拟:

class Solution {
public:vector<int> executeInstructions(int n, vector<int>& startPos, string s) {vector<int> ans;for (int i = 0; i < s.size(); ++i){vector<int> curPos = startPos;int curAns = 0;for (int j = i; j < s.size(); ++j){if (s[j] == 'L'){--curPos[1];}else if (s[j] == 'R'){++curPos[1];}else if (s[j] == 'U'){--curPos[0];}else if (s[j] == 'D'){++curPos[0];}if (curPos[0] < 0 || curPos[0] > n - 1 || curPos[1] < 0 || curPos[1] > n - 1){break;}++curAns;}ans.push_back(curAns);}return ans;}
};

如果s的长度为m,则此算法时间复杂度为O(m 2 ^{2} 2),空间复杂度为O(1)。

法二:我们先无视网格边界,计算出执行完所有指令后的坐标,然后从后往前遍历指令,每遍历到一个指令,我们先保存下来这个指令后面还有几个指令(即倒序遍历到了当前第几个),然后undo这条指令,然后再计算当前位置与起始位置的偏移,这个偏移可以看做网格的偏移而非机器人的偏移,计算出网格的偏移后,我们可以计算出新的出界条件,开始时是x或y为-1到n时出界,现在出界条件要加上偏移量。然后,核心思想是,我们是知道当前位置距离结束还有几个指令的,我们也知道边界条件下到指令结束还有几个指令(前面每遍历到一个位置保存的),因此两者相减就是还可执行的指令数:

class Solution {
public:vector<int> executeInstructions(int n, vector<int>& startPos, string s) {int x = startPos[1];int y = startPos[0];for (char c : s){if (c == 'U'){--y;}else if (c == 'D'){++y;}else if (c == 'L'){--x;}else if (c == 'R'){++x;}}vector<int> ans(s.size());map<int, int> dx;map<int, int> dy;for (int i = s.size() - 1; i >= 0; --i){// 记录到当前位置到命令串终止还有几个指令dx[x] = s.size() - i;dy[y] = s.size() - i;// undo指令,为了下步遍历做准备if (s[i] == 'U'){++y;}else if (s[i] == 'D'){--y;}else if (s[i] == 'L'){++x;}else if (s[i] == 'R'){--x;}// 获取当前位置到起始位置的偏移// 我们接下来要把整个网格移动这个偏移量// 我们要先undo指令再计算偏移量,因为这才是执行当前遍历到的指令前的位置// 举例来说,第一次遍历时玩家位置在执行完最后一条指令后的位置int xDiff = x - startPos[1];int yDiff = y - startPos[0];// 原本是到-1或n时出界,由于网格也偏移了,加上偏移量,得到新的出界条件// 这一步是获取在网格偏移后的界限上,到终止还有几个指令// 之所以要取max,举例来解释,如果2×2的格子先向上移动100次,再向下移动200次// 那么我们应该取首次出界时后面还有几个指令int afterEndInstructionNum = max({dx[-1 + xDiff], dx[n + xDiff], dy[-1 + yDiff], dy[n + yDiff]});ans[i] = s.size() - i - afterEndInstructionNum;}return ans;}
};

如果s的长度为m,则此算法时间复杂度为O(m),空间复杂度为O(m)。

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

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

相关文章

多行业万能预约门店小程序源码系统 支持多门店预约小程序 带完整的安装代码包以及搭建教程

随着消费者对于服务体验要求的不断提升&#xff0c;门店预约系统成为了许多行业提升服务质量、提高运营效率的重要工具。然而&#xff0c;市面上的预约系统往往功能单一&#xff0c;无法满足多行业、多场景的个性化需求。下面&#xff0c;小编集合了多年的行业经验和技术积累&a…

11:日志分析系统ELK|Elasticsearch|kibana

日志分析系统ELK&#xff5c;Elasticsearch&#xff5c;kibana 日志分析系统ELKELK概述Elasticsearch安装Elasticsearch部署Elasticsearch集群Elasticsearch插件 熟悉Elasticsearch的API调用_cat API创建 tedu 索引使用 PUT 方式增加数据查询数据修改数据删除数据 KibanaKibana…

Android T 远程动画显示流程其三——桌面侧动画启动到系统侧结束流程

前言 接着前文分析Android T 远程动画显示流程其二 我们通过IRemoteAnimationRunner跨进程通信从系统进程来到了桌面进程&#xff0c;这里是真正动画播放的逻辑。 之后又通过IRemoteAnimationFinishedCallback跨进程通信回到系统进程&#xff0c;处理动画结束时的逻辑。 进入…

基于yolov5的电瓶车和自行车检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的电瓶车和自行车检测系统_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的电瓶车和自行车检测系统是在pytorch框架下实现的&#xff0c;这是一个完整的项目&#xff0c;包括代码&#xff0c;数据集&#xff0c;训练好的模型…

svn介绍 4.0

一、svn介绍&#xff08;版本控制工具&#xff09; 1、svn的定义&#xff1a; svn是一个开放源代码的版本控制系统&#xff0c;通过采用分支管理系统的高效管理&#xff0c;简而言之就是用于多个人共同开发同一个项目&#xff0c;实现共享资源&#xff0c;实现最终集中式个管…

2024年sCrypt编程马拉松即将开幕

BSV区块链的建设者们&#xff0c;你们在哪&#xff1f;2024年sCrypt编程马拉松即将拉开帷幕&#xff01; 2024年3月16日至17日&#xff0c;我们将在旧金山市举办一场以比特币智能合约&#xff08;即 sCrypt&#xff09;和比特币通证&#xff08;如Ordinals&#xff09;相结合为…

【蛀牙】日常生活如何正确护理牙齿?刷牙、洗牙、补牙

程序员生活指南之 【蛀牙】日常生活如何正确护理牙齿&#xff1f;刷牙、洗牙、补牙 文章目录 一、日常如何清洗牙齿&#xff1f;——刷牙与洗牙1、牙齿污垢1.1 牙菌斑1.2 软垢1.3 牙结石1.4 牙龈出血 2、如何刷牙2.1 关于时间2.2 各种工具2.3 巴氏刷牙法 二、定期进行洗牙3、如…

链表OJ刷题(二)

制作不易&#xff0c;三连支持一下呗&#xff01;&#xff01;&#xff01; 文章目录 前言一、链表的回文结构二、相交链表三、链表中倒数第k个节点四、环形链表Ⅰ和Ⅱ总结 前言 一、链表的回文结构 链表的回文结构_牛客题霸_牛客网 这里我们需要先了解一下什么叫做回文&#…

React之组件定义和事件处理

一、组件的分类 在react中&#xff0c;组件分为函数组件和class组件&#xff0c;也就是无状态组件和有状态组件。 * 更过时候我们应该区别使用无状态组件&#xff0c;因为如果有状态组件会触发生命周期所对应的一些函数 * 一旦触发他生命周期的函数&#xff0c;它就会影响当前项…

MQL5学习之RSI指标编写

研究MT5时发现MQL5这个指标编写功能很强大&#xff0c;应该是碾压国内所有的指标系统&#xff0c;不过这个东西相对复杂很多&#xff0c;比通达信公式不知复杂几许&#xff0c;看起来和C语法接近&#xff0c;倒是比较适合自己。试着玩一下&#xff0c;发现还是有点难度的。索性…

修改centos7的dns解决docker拉取镜像超时问题

近期在一台centos7的服务器上部署系统&#xff0c;拉取docker镜像时总是超时&#xff0c;如图所示。网上有教程说&#xff0c;可以修改操纵系统的dns地址&#xff0c;试了一下&#xff0c;果然搞定。 打开dns配置文件 sudo vi /etc/resolv.conf发觉里面的地址设为114.114.114…

Qt篇——QTableWidget保存表格数据到Excel文件中,读Excel内容到QTableWidget

表格和excel例子如下图所示&#xff1a; 一、QTableWidget保存表格数据到Excel文件中 代码如下&#xff1a; &#xff08;pro文件中添加QT axcontainer&#xff09; #include <QAxObject>void MainWindow::saveTableToExcel() {QDateTime current_date_time QDateTi…

交友社交软件开发-php交友聊天系统-

为了开发一个高效的交友系统&#xff0c;需要一个完善的信息管理和筛选机制。这个系统应该能够根据用户的个人信息、兴趣爱好、价值观等标准进行筛选&#xff0c;并向用户提供符合他们要求心仪的人的信息。为了实现这个目标&#xff0c;系统可以利用人工智能技术&#xff0c;分…

经销商文件分发 怎样兼顾安全和效率?

经销商文件分发是指将文件、资料、产品信息等从制造商或经销商传递给经销商的过程。这一过程对于确保经销商能够获取最新的产品信息、销售策略、市场活动资料等至关重要。 想要管理众多经销商合作伙伴之间的文件传输并提高效率&#xff0c;可以采取以下措施&#xff1a; 1、建…

中文文本分类(pytorch 实现)

import torch import torch.nn as nn import torchvision from torchvision import transforms, datasets import os, PIL, pathlib, warningswarnings.filterwarnings("ignore") # 忽略警告信息# win10系统 device torch.device("cuda" if torch.cuda.i…

【yolov8部署实战】VS2019环境下使用Onnxruntime环境部署yolo项目|含源码

一、前言 部署yolo项目&#xff0c;是我这几个月以来做的事情&#xff0c;最近打算把这几个月试过的方法&#xff0c;踩过的坑&#xff0c;以博客的形式&#xff0c;分享一下。关于下面动态中讲到的如何用opencv部署&#xff0c;我在上一篇博客中已经详细讲到了&#xff1a;【…

JavaWeb 自己给服务器安装SQL Server数据库遇到的坑

之前买的虚拟主机免费送了一个SQL Server数据库&#xff0c;由于服务器提供商今年下架我用的那款虚拟主机产品&#xff0c;所以数据库也被收回了。我买了阿里云云服务器&#xff0c;但是没有数据库&#xff0c;于是自己装了一个SQL Server数据库&#xff0c;总结一下遇到的坑。…

el-input组件当数据为空时, 边框变红,并提示错误信息

1&#xff0c;样式 初始&#xff1a; 当不输入口令&#xff0c; 点击确定时&#xff1a; 2, 思路 主要是使用动态类的方式。 先设置输入框变红的样式以及提示文字的样式class 对于样式class 用变量来控制是否奏效。 3&#xff0c; 代码实现 //html&#xff1a; <div cl…

【leetcode】 剑指 Offer学习计划(java版本含注释)(下)

目录 前言第十六天&#xff08;排序&#xff09;剑指 Offer 45. 把数组排成最小的数&#xff08;中等&#xff09;剑指 Offer 61. 扑克牌中的顺子&#xff08;简单&#xff09; 第十七天&#xff08;排序&#xff09;剑指 Offer 40. 最小的k个数&#xff08;简单&#xff09; 第…

NCDA设计大赛获奖作品剖析:UI设计如何脱颖而出?

第十二届大赛简介 - 未来设计师全国高校数字艺术设计大赛&#xff08;NCDA&#xff09;开始啦&#xff01;视觉传达设计命题之一: ui 设计&#xff0c;你想知道的都在这里。为了让大家更好的参加这次比赛&#xff0c;本文特别为大家整理了以往NCDA大赛 UI 设计的优秀获奖作品&a…