LeetCode 2596. 检查骑士巡视方案【数组,模拟】1448

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

骑士在一张 n x n 的棋盘上巡视。在有效的巡视方案中,骑士会从棋盘的 左上角 出发,并且访问棋盘上的每个格子 恰好一次

给你一个 n x n 的整数矩阵 grid ,由范围 [0, n * n - 1] 内的不同整数组成,其中 grid[row][col] 表示单元格 (row, col) 是骑士访问的第 grid[row][col] 个单元格。骑士的行动是从下标 0 开始的。

如果 grid 表示了骑士的有效巡视方案,返回 true;否则返回 false

注意,骑士行动时可以垂直移动两个格子且水平移动一个格子,或水平移动两个格子且垂直移动一个格子。下图展示了骑士从某个格子出发可能的八种行动路线。

示例 1:

输入:grid = [[0,11,16,5,20],[17,4,19,10,15],[12,1,8,21,6],[3,18,23,14,9],[24,13,2,7,22]]
输出:true
解释:grid 如上图所示,可以证明这是一个有效的巡视方案。

示例 2:

输入:grid = [[0,3,6],[5,8,1],[2,7,4]]
输出:false
解释:grid 如上图所示,考虑到骑士第 7 次行动后的位置,第 8 次行动是无效的。

提示:

  • n == grid.length == grid[i].length
  • 3 <= n <= 7
  • 0 <= grid[row][col] < n * n
  • grid 中的所有整数 互不相同

解法 直接模拟

题目要求骑士的移动的每一步均按照「日」字形跳跃,假设从位置 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) 跳跃到 ( x 2 , y 2 ) (x_2, y_2) (x2,y2) ,则此时一定满足下面两种情形之一:
∣ x 1 − x 2 ∣ = 1 , ∣ y 1 − y 2 ∣ = 2 |x_1 - x_2| = 1, |y_1 - y_2| = 2 x1x2=1,y1y2=2

设矩阵的长度为 n n n ,其中 g r i d [ r o w ] [ c o l ] grid[row][col] grid[row][col] 表示单元格 ( r o w , c o l ) (row,col) (row,col)是骑士访问的第 g r i d [ r o w ] [ c o l ] grid[row][col] grid[row][col] 个单元格,因此可以知道每个单元格的访问顺序,我们用 i n d i c e s indices indices 存储单元格的访问顺序,其中 i n d i c e s [ i ] indices[i] indices[i] 表示骑士在经过第 i − 1 i-1 i1 次跳跃后的位置。

由于骑士的行动是从下标 0 0 0 开始的,因此一定需要满足 g r i d [ 0 ] [ 0 ] = 0 grid[0][0]=0 grid[0][0]=0 ,接下来依次遍历 i n d i c e s indices indices 中的每个元素。由于 i n d i c e s [ i ] indices[i] indices[i] 是一次跳跃的起点, i n d i c e s [ i + 1 ] indices[i+1] indices[i+1] 是该次跳跃的终点,则依次检测每一次跳跃的行动路径是否为「日」字形,即满足如下条件:

  • ∣ indices [ i ] [ 0 ] − indices [ i + 1 ] [ 0 ] ∣ = 1 , ∣ indices [ i ] [ 1 ] − indices [ i + 1 ] [ 1 ] ∣ = 2 ∣ |\textit{indices}[i][0] - \textit{indices}[i+1][0]| = 1, |\textit{indices}[i][1] - \textit{indices}[i+1][1]| = 2∣ indices[i][0]indices[i+1][0]=1,indices[i][1]indices[i+1][1]=2
  • ∣ indices [ i ] [ 0 ] − indices [ i + 1 ] [ 0 ] ∣ = 2 , ∣ indices [ i ] [ 1 ] − indices [ i + 1 ] [ 1 ] ∣ = 1 ∣ |\textit{indices}[i][0] - \textit{indices}[i+1][0]| = 2, |\textit{indices}[i][1] - \textit{indices}[i+1][1]| = 1∣ indices[i][0]indices[i+1][0]=2,indices[i][1]indices[i+1][1]=1

为了方便计算,我们只需检测 ∣ x 1 − x 2 ∣ × ∣ y 1 − y 2 ∣ |x_1 - x_2| \times |y_1 - y_2| x1x2×y1y2 ​是否等于 2 2 2 即可。如果所有跳跃路径均合法则返回 true \text{true} true ,否则返回 false \text{false} false

class Solution {
public:bool checkValidGrid(vector<vector<int>>& grid) {if (grid[0][0] != 0) return false;int n = grid.size();vector<array<int, 2>> indices(n * n);for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j)indices[grid[i][j]] = {i, j};for (int i = 1; i < indices.size(); ++i) {int dx = abs(indices[i][0] - indices[i - 1][0]);int dy = abs(indices[i][1] - indices[i - 1][1]);if (dx * dy != 2) return false;}return true;}
};

复杂度分析:

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2) ,其中 n n n 表示二维棋盘边的长度。需要检测棋盘中的每个位置,一共需要检测 n 2 n^2 n2 个位置,因此时间复杂度为 O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2) ,其中 n n n 表示二维棋盘边的长度。用来需要存放每个位置的访问顺序,一共有 n 2 n^2 n2 个位置,需要的空间为 O ( n 2 ) O(n^2) O(n2)

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

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

相关文章

云计算的未来:云原生架构和自动化运维的崭露头角

文章目录 云原生架构&#xff1a;重新定义应用开发和部署什么是云原生架构&#xff1f;为什么云原生架构重要&#xff1f;1. 弹性和伸缩性2. 故障隔离3. 更快的交付4. 资源利用率5. 多云支持 云原生架构的实践步骤 1&#xff1a;容器化步骤 2&#xff1a;微服务步骤 3&#xff…

JavaWeb后端开发 JWT令牌解析 登录校验 通用模板/SpringBoot整合

目录 实现思路 相关技术的解析 ​编辑会话跟踪三个方案 JWT令牌技术 ​生成令牌 校验令牌 登录下发令牌 实现思路 通过登录成功的标记来检测,在每个接口前做一个标记判断是否登录,若没登录则返回错误信息,并使前端退出.但这样较为繁琐,因此我们可以通过一种统一拦截的技…

R语言-关于颜色

目录 颜色 示例 R 颜色板 参考&#xff1a; 颜色 什么场景会用到颜色&#xff1f;比如在绘图过程中&#xff0c;为了让图更好看&#xff0c;有的时候&#xff0c;需要选择使用不同的颜色进行绘制或者填充。本文提供了R颜色的相关参数。 在R中&#xff0c;可以通过颜色下标…

Flask框架-1-[群聊]: flask-socketio实现websocket的功能

一、项目结构 flask_websocket |---static |---js |---jquery-3.7.0.min.js |---socket.io_4.3.1.js |---templates |---home |---group_chat.html |---index.html |---app.py 1.1、python环境 python3.9.0 1.2、依赖包 Flask2.1.0 eventlet0.33.3 Flask-SocketIO5.3.4 1.…

gpt扣款失败,openai扣款失败无法使用-如何解决gpt扣款失败的问题?

gpt扣款失败&#xff0c;openai扣款失败无法使用。毕竟你花了钱却无法使用你所期待的服务&#xff0c;这种情况确实令人不快。但是&#xff0c; 为什么gpt扣款失败&#xff1f; 可能是由于支付问题导致的扣款失败。这包括信用卡额度不足、支付信息错误等等。如果你的支付信息…

NI SCXI-1520 控制主板模块

NI SCXI-1520 是 National Instruments&#xff08;NI&#xff09;生产的控制主板模块&#xff0c;通常用于 NI 的 SCXI&#xff08;Signal Conditioning eXtensions for Instrumentation&#xff09;模块化测量和控制系统中&#xff0c;以实现信号调理、数据采集和控制。以下是…

问道管理:机器人产业迎催化 黄金价格或将突破前高

昨日&#xff0c;沪指盘中震动下探&#xff0c;一度跌近1%逼近3100点&#xff0c;尾盘逐步止跌&#xff1b;深成指、创业板指均跌超1%。截至收盘&#xff0c;沪指跌0.45%报3123.07点&#xff0c;深成指跌1.14%报10255.87点&#xff0c;创业板指跌1.14%报2027.73点&#xff0c;科…

全局异常处理器@RestControllerAdvice解析 Springboot项目异常处理 JavaWeb @ExceptionHandler

RestControllerAdvice public class GlobalExceptionHandler {ExceptionHandler(Exception.class)//指定捕获异常类型:所有public Result ex(Exception ex){ex.printStackTrace();return Result.error("对不起,出现异常,请联系管理员");}}RestControllerAdvice注解在…

淘宝商品详情数据采集

淘宝商品详情数据采集的方法如下&#xff1a; 确定采集目标&#xff1a;明确要采集的商品信息&#xff0c;如商品标题、价格、销量、评论、图片等。选择采集工具&#xff1a;可以选择Scrapy框架、Java的WebMagic框架等。编写爬虫程序&#xff1a;进入目标文件夹&#xff0c;输…

起尔正版虚拟商品交易商城源码系统 第三方交易平台网站源码

起尔网正版虚拟商品交易商城源码系统 Thinkct多商户源码系统商城&#xff0c;采用Thinkphp框架打造&#xff0c;后端采用Thinkadmin开发响应速度控制200ms内 起尔网正版虚拟商品交易商城源码系统 - 起尔网起尔网正版虚拟商品交易商城源码系统 Thinkct多商户源码系统商城&#…

数据结构和算法(7):图应用

双连通分量&#xff1a;判定准则 考查无向图G。若删除顶点v后G所包含的连通域增多&#xff0c;则v称作切割节点或关节点。 不含任何关节点的图称作双连通图。 任一无向图都可视作由若干个极大的双连通子图组合而成&#xff0c;这样的每一子图都称作原图的一个双连通域。 如何…

HTML实现移动端布局与页面自适应

我们所说的布局方式&#xff0c;这里我们通常指的是width和height在不同页面情况下面的改变。 常见页面的布局方式有 静态布局 &#xff08;px布局&#xff0c;就是固定其高宽&#xff0c;不论页面怎样放大缩小&#xff0c;其占领的依旧是&#xff0c;使用px固定了的高宽&…

JumpServer开源堡垒机与爱可生云树数据库完成兼容性认证

近日&#xff0c;中国领先的开源软件提供商FIT2CLOUD飞致云宣布&#xff0c;JumpServer开源堡垒机已经完成与爱可生云树数据库软件的兼容性认证。经过双方联合测试&#xff0c;云树数据库软件&#xff08;简称&#xff1a;ActionDB&#xff09;V1.0与杭州飞致云信息科技有限公司…

Java下打印九九乘法表

这个算法是基于打直角三角型演变而来&#xff0c;代码如下&#xff1a; public class MyWork {public static void main(String[] args) {for (int i 1; i < 10; i) {for (int j 1; j < i; j) {System.out.print(j "x" i "" i*j "\t&qu…

阿里云服务器开放的一个新端口,重启防火墙,端口未启动

问题&#xff1a; 阿里云网页开放的一个新端口后&#xff0c;重启防火墙&#xff0c;端口未启动&#xff0c;之前配置的也都停止了。 解决&#xff1a; 原因可能是阿里的服务控制了&#xff0c;只能一个个端口开启了。把新配置新端口也单独启用。 开启80端口指令 firewall-cm…

SqlServer在尝试加载程序集 ID 65917 时 Microsoft .NET Framework 出错。服务器可能资源不足,或者不信任该程序集

问题&#xff1a;在尝试加载程序集 ID 65917 时 Microsoft .NET Framework 出错。服务器可能资源不足&#xff0c;或者不信任该程序集&#xff0c;因为它的 PERMISSION_SET 设置为 EXTERNAL_ACCESS 或 UNSAFE。 检查数据库属性&#xff1a;检查服务器是否信任该程序集 解决方法…

数据分析回头看2——重复值检查/元素替换/异常值筛选

0、前言&#xff1a; 这部分内容是对Pandas的回顾&#xff0c;同时也是对Pandas处理异常数据的一些技巧的总结&#xff0c;不一定全面&#xff0c;只是自己在数据处理当中遇到的问题进行的总结。 1、当数据中有重复行的时候需要检测重复行&#xff1a; 方法&#xff1a;使用p…

Android 12 源码分析 —— 应用层 五(SystemUI的StatusBar类的启动过程和三个窗口的创建)

Android 12 源码分析 —— 应用层 五&#xff08;SystemUI的StatusBar类的启动过程和三个窗口的创建&#xff09; 更新历史日期内容12023-9-18修改关于mLightsOutNotifController的错误注释 在前面的文章中&#xff0c;我们介绍了SystemUI App的基本布局和基本概念。接下来&a…

《PostgreSQL与NoSQL:合作与竞争的关系》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

【AI】机器学习——支持向量机(线性模型)

支持向量机是一种二分类算法&#xff0c;通过在高维空间中构建超平面实现对样本的分类 文章目录 5.1 SVM概述5.1.1 分类 5.2 线性可分SVM5.2.1 线性可分SVM基本思想5.2.2 策略函数间隔几何间隔硬间隔最大化 5.2.3 原始算法支持向量 5.2.4 对偶形式算法1. 构造并求解对偶问题2. …