Leetcode 54. 螺旋矩阵(二维数组移动坐标)

54. 螺旋矩阵

使用vis数组记录该位置是否已经被访问
定义一个int型dir来记录方向,0123分别代表右下左上
当越界或碰壁已访问的位置后,修改dir并计算下一个位置
否则根据原dir计算下一个位置

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> list = new ArrayList<>();int n = matrix.length;int m = matrix[0].length;int dir = 0; // 0右  1下  2左  3上boolean vis[][] = new boolean[n][m];int x = 0;int y = 0;for(int i = 0; i < n*m; i ++){list.add(matrix[x][y]);vis[x][y] = true;if(dir == 0){if(y + 1 >= m || vis[x][y+1] == true){dir = (dir + 1) % 4;x = x + 1;}else{y = y + 1;}}else if(dir == 1){if(x + 1 >= n || vis[x+1][y] == true){dir = (dir + 1) % 4;y = y - 1;}else{x = x + 1;}}else if(dir == 2){if(y - 1 < 0 || vis[x][y-1] == true){dir = (dir + 1) % 4;x = x - 1;}else{y = y - 1;}}else{if(x - 1 < 0 || vis[x-1][y] == true){dir = (dir + 1) % 4;y = y + 1;}else{x = x - 1;}}}return list;}
}

简化

常用思路,使用二维数组dirs[4][2]进行坐标的上下左右四个方位移动,简化代码
(也常用dirs[8][2]获取坐标的周围8个位置)
使用dirs和dir计算下一个将要使用的新坐标,若越界或碰壁,则将dir修改,获得正确的新坐标

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> list = new ArrayList<>();int n = matrix.length;int m = matrix[0].length;int dir = 0; // 0右  1下  2左  3上int dirs[][] = {{0,1},{1,0},{0,-1},{-1,0}}; // 对应dir四种移动坐标变化boolean vis[][] = new boolean[n][m];int x = 0;int y = 0;for(int i = 0; i < n*m; i ++){list.add(matrix[x][y]);vis[x][y] = true;// 判断int newX = x + dirs[dir][0];int newY = y + dirs[dir][1];if(newX < 0 || newX >= n || newY < 0 || newY >= m || vis[newX][newY] == true){dir = (dir + 1) % 4;}// 移动x += dirs[dir][0];y += dirs[dir][1];}return list;}
}

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

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

相关文章

MySQL—多表查询—多表关系介绍

一、引言 提到查询&#xff0c;我们想到之前学习的单表查询&#xff08;DQL语句&#xff09;。而这一章节部分的博客我们将要去学习和了解多表查询。 对于多表查询&#xff0c;主要从以下7个方面进行学习。 &#xff08;1&#xff09;第一部分&#xff1a;介绍 1、多表关系 2、…

每日5题Day18 - LeetCode 86 - 90

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;86. 分隔链表 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;…

Vue前端在线预览文件插件

Vue前端在线预览文件插件 一、使用场景 1.1.像文档资料等&#xff0c;只想让他人在线预览&#xff0c;但不能下载。此等场景需求可以用到此插件。 二、此文档介绍两种插件 1.view.xdocin插件 (上线后免费几天&#xff0c;然后收费&#xff0c;添加作者后&#xff0c;可以延…

二叉树的实现(初阶数据结构)

1.二叉树的概念及结构 1.1 概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合&#xff1a; 1.或者为空 2.由一个根结点加上两棵别称为左子树和右子树的二叉树组成 从上图可以看出&#xff1a; 1.二叉树不存在度大于2的结点 2.二叉树的子树有左右之分&#xff0c;次序不能…

DevOps入门

DevOps: 让技术团队、运维、测试等团队实现一体式流程自动化 CICD: CI:持续集成 CD:持续交付持续集成:从编码、编译、测试、发布项目到仓库的自动化流程持续交付:包含持续集成&#xff0c;并且增加将项目部署到对应的环境的自动化流程 传统项目闭环流程: DevOps闭环流程…

软考架构-计算机网络考点

会超纲&#xff0c;3-5分 网络分类 按分布范围划分 局域网 LAN 10m-1000m左右 房间、楼宇、校园 传输速率高 城域网 MAN 10km 城市 广域网 WAN 100km以上 国家或全球&#xff08;英特网&#xff09; 按拓扑结构划分 总线型&#xff1a;利用率低、干…

问题:设备管理指标为完好率不低于( ),待修率不高于5%,事故率不高于1%。 #知识分享#经验分享#经验分享

问题&#xff1a;设备管理指标为完好率不低于( )&#xff0c;待修率不高于5%&#xff0c;事故率不高于1%。 A、100% B、95% C、90% D、80% 参考答案如图所示

思维,CF1575K - Knitting Batik

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1575K - Knitting Batik 二、解题报告 1、思路分析 诈骗题&#xff0c;上面…

数据库连接池原理

一、代码演示一下&#xff0c;基于 BlockingQueue public class JDBCPool {private static final String JDBC_URL "jdbc:mysql://localhost:3306/yourdb";private static final String USER "username";private static final String PASSWORD "p…

Android开机动画关闭流程

一步一图项目上要加一个开机动画结束的回调&#xff0c;我这边看下如何加 好&#xff0c;老规矩&#xff0c;如何启动动画&#xff1f;动画是谁启动的&#xff1f;怎么关闭的&#xff1f;谁通知关闭的 带着问题看源码 动画的启动流程 开机动画的主入口在哪&#xff1f; 这个…

数据结构--线性表和串

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

zookeeper节点启动的主要逻辑

1.前言 QuorumPeer是一个线程对象&#xff0c;里面比较核心的方法是run方法&#xff0c;但QuorumPeer的run方法比较复杂&#xff0c;里面包含着针对QuorumPeer的各种状态的判断&#xff0c;里面的代码比较长&#xff0c;zk节点的looking状态下的操作&#xff0c;下面这块代码是…

三大网络简介

一、三大网是哪三大网 三大网络为电话网、电视广播网、互联网&#xff0c;如果这三大网络使用都是“ip分组交换”技术的话&#xff0c;他们将会被融合成为一个网络&#xff0c; 但是由于历史原因&#xff0c;他们使用了不同的通信技术&#xff0c;三大网各自拥有相当的独立性&a…

2024-06-08 Unity 编辑器开发之编辑器拓展9 —— EditorUtility

文章目录 1 准备工作2 提示窗口2.1 双键窗口2.2 三键窗口2.3 进度条窗口 3 文件面板3.1 存储文件3.2 选择文件夹3.3 打开文件3.4 打开文件夹 4 其他内容4.1 压缩纹理4.2 查找对象依赖项 1 准备工作 ​ 创建脚本 “Lesson38Window.cs” 脚本&#xff0c;并将其放在 Editor 文件…

MySQL Show命令集

MySQL SHOW 命令 1、mysql shell 查看帮助show (rootlocalhost) [(none)]> \help show Name: SHOW Description: SHOW has many forms that provide information about databases, tables, columns, or status information about the server. This section describes thos…

Vue3【十二】09Computed计算属性

Vue3【十二】09Computed计算属性 计算属性 获取全名 这种方式是只读的不能修改 这样定义fullName是一个计算属性&#xff0c;可读可写 案例截图 目录结构 代码 Person.vue <template><div class"person"><h1>我是 Person 组件</h1>姓&…

基于OpenVINO实现无监督异常检测

异常检测(AD) 在欺诈检测、网络安全和医疗诊断等关键任务应用中至关重要。由于数据的高维性和底层模式的复杂性&#xff0c;图像、视频和卫星图像等视觉数据中的异常检测尤其具有挑战性。然而&#xff0c;视觉异常检测对于检测制造中的缺陷、识别监控录像中的可疑活动以及检测医…

三维重建 虚拟内窥镜(VE)是什么?怎么实现 使用场景

1.虚拟内窥镜&#xff1a; 就是利用计算机图形学、虚拟现实、图像处理和科学可视化等信息处理技术仿真光学内窥镜对病人进行诊断的一种技术。 VE(Virtual Endoscopy)&#xff0c;虚拟内镜技术。这种CT重建图像可以模拟各种内镜检查的效果&#xff0c;它是假设视线位于所要观察…

探索微软新VLM Phi-3 Vision模型:详细分析与代码示例

引言 在最近的微软Build大会上&#xff0c;微软宣布了许多新内容&#xff0c;其中包括新款Copilot PC和围绕Copilot生态系统的一系列功能。其中最引人注目的是发布了一些新的Phi模型&#xff0c;特别是Phi-3 Vision模型。本文将详细探讨Phi-3 Vision模型的特性&#xff0c;并提…

vue 路由(二)-- 进阶

vue 路由&#xff08;二&#xff09;-- 进阶 路由向组件传递参数传参方式: 在路径传递参数params name 传递参数query 参数 props 接收路由的 params完整的例子 HTML5 History 模式meta 元信息导航守卫全局守卫 过渡效果参考 路由可向路由匹配的组件传递参数&#xff0c; 不同…