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.hqwc.cn/news/499929.html

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

相关文章

Docker中创建nginx-rtmp流媒体服务器

准备工作 需要安装好docker安装好镜像 docker pull alfg/nginx-rtmp docker run -it -p 1935:1935 -p 8080:80 --rm alfg/nginx-rtmp #创建临时容器&#xff0c;容器停止即删除安装好ffmpeg sudo apt update sudo apt install ffmpeg ffmpeg -version安装成功出现如下信息&…

ChatGPT4.0 的优势、升级 4.0 为什么这么难以及如何进行升级?

前言 “ChatGPT4.0一个月多少人民币&#xff1f;” ”chatgpt4账号“ ”chatgpt4 价格“ “chatgpt4多少钱” 最近发现很多小伙伴很想知道关于ChatGPT4.0的事情&#xff0c;于是写了这篇帖子&#xff0c;帮大家分析一下。 一、ChatGPT4.0 的优势 &#xff08;PS&#xff1a;…

一张照片一键换脸:无需数据集和训练 | 开源日报 No.186

s0md3v/roop Stars: 23.6k License: AGPL-3.0 roop 是一个一键换脸的项目。 该项目可以通过一张目标人物的照片&#xff0c;实现对视频中人脸进行替换&#xff0c;无需数据集和训练。其主要功能、关键特性和核心优势包括&#xff1a; 可以在计算机上运行&#xff0c;并支持 C…

PYCHARM PYSIDE6 QT 打包异常处理 no qt platform plugin could be initialized

安装有PYSIDE6的电脑 异常错误 … no qt platform plugin could be initialized … 变量名&#xff1a;QT_QPA_PLATFORM_PLUGIN_PATH &#xff08;一个字都不能改&#xff01;&#xff01;&#xff09; 自己环境变量值&#xff1a;D:\Users\topma\anaconda3\Lib\site-package…

React中对表格实现列表的拖拽排序

1. 效果:推拽手柄列 2. 实现: react中我们需要两个包来实现 ‘array-move’‘react-sortable-hoc’Installation Use npm $ npm install react-sortable-hoc --save 引入 import { arrayMoveImmutable } from array-move import { SortableContainer, SortableElement, Sort…

力扣精选算法100道——排序数组(分治快排)

目录 &#x1f6a9;了解题意 &#x1f6a9;算法原理 &#x1f388;取随机值 &#x1f388;c中取随机数的步骤 &#x1f6a9;代码实现 &#x1f6a9;了解题意 本题的题意很简单&#xff0c;就是将nums数组排成升序即可。 &#x1f6a9;算法原理 本题和颜色分类那个题目很…

Tiktok矩阵系统搭建的逻辑和源代码!

很多和我一样从事外贸工具开发的朋友都清楚&#xff0c;TikTok矩阵系统不仅确保了平台的高效运行&#xff0c;还为用户提供了个性化的内容推荐&#xff0c;从而大大提升了用户黏性&#xff0c;因此很多人都乐意去开发类似的工具&#xff0c;下面我们就来说说Tiktok矩阵系统搭建…

docker 基础(二)

常见命令 Docker最常见的命令就是操作镜像、容器的命令&#xff0c;详见官方文档&#xff1a;https://docs.docker.com/ 数据卷 命令说明文档地址docker volume create创建数据卷docker volume createdocker volume ls创建数据卷docker volume lsdocker volume rm查看所有数…

SCI 投稿各阶段的邮件

SCI 投稿各阶段的邮件 SCI 投稿各阶段的邮件

C#学习:初识各类应用程序

编写我们第一个程序——Hello,World! 1.编程不是“学”出来的&#xff0c;而是“练”出来的 2.在反复应用中积累&#xff0c;忽然有一天就会顿悟 3.学习原则&#xff1a; 3.1从感官到原理 3.2从使用别人的到创建自己的 3.3必需亲自动手 3.4必需学以致用&#xff0c;紧跟实际…

金融帝国实验室(CapLab)官方更新_V9.1.65版本(2024年第13次)

〖金融帝国实验室〗&#xff08;Capitalism Lab&#xff09;游戏更新记录&#xff08;2024年度&#xff09; ————————————— ◎游戏开发&#xff1a;Enlight Software Ltd.&#xff08;微启软件有限公司&#xff09; ◎官方网站&#xff1a;https://www.capitalism…

【Git教程】(七)变基与拣取 —— 变基操作的概念、适用场景及其实现方式,拣取操作的实现 ~

Git教程 变基与拣取 1️⃣ 工作原理&#xff1a;复制提交2️⃣ 避免“钻石链”3️⃣ 什么情况下会遇到冲突4️⃣ 移植分支5️⃣ 执行变基后原提交的情况6️⃣ 提交的原件与副本存在于同一版本库中所带来的问题7️⃣ 捡取&#x1f33e; 总结 通常&#xff0c; 一段提交历史中往…