【二刷代码随想录】螺旋矩阵求解方法、推荐习题

一、求解方法 

(1)按点模拟路径

        在原有坐标的基准上,叠加 横纵坐标 的变化值,求出下一位置,并按题完成要求。但需注意转角的时机判断,特别是最后即将返回上一出发点的位置。

(2)按层模拟路径

        在原有的形状基础上,画出 上下左右 四根边界线,按照顺序完成画圈。但需要关注单行或单列可能存在重复的情况,因此需在操作 边界线时加上判定条件。

(3)心路历程

        最开始掌握的是 Carl 教的循环画框类的思路,但是它的应用是在方形样式,其中的 offset 和 中间元素处理对于方形图案比较好处理,但是针对矩形样式,我真的不知道要怎么改了。后改学其他思路,也就是上述两种。

二、推荐例题

(1)方形样式的螺旋矩阵

        59. 螺旋矩阵 II

方法1:点模拟

class Solution {public int[][] generateMatrix(int n) {    int curNum = 1;int maxNum = n * n;int curRow = 0;int curCol = 0;int dirIndex = 0;int[][] dirs = {{0,1}, {1,0}, {0,-1}, {-1,0}};int[][] res = new int[n][n];while(curNum <= maxNum){res[curRow][curCol] = curNum++;//判定后续位置是否越界int nextRow = curRow + dirs[dirIndex][0];int nextCol = curCol + dirs[dirIndex][1];//需要加一个res[nextRow][nextCol] != 0 因为走了一圈之后就回到了原点,需要避免回原点,而是调整方向//比如三阶矩阵中的最后9,若不调整方向,则会放到原点处if(nextRow < 0 || nextRow > n-1 || nextCol < 0 || nextCol > n-1 || res[nextRow][nextCol] != 0){dirIndex = (dirIndex+1) % 4;}curRow = curRow + dirs[dirIndex][0];curCol = curCol + dirs[dirIndex][1];}return res;}
}

方法2:层模拟

class Solution {public int[][] generateMatrix(int n) {    int left = 0;int right = n-1;int top = 0;int bottom = n-1;int num = 1;int[][] res = new int[n][n];while(left <= right && top <= bottom){//上:从左往右-----j 从 left ---> rightfor(int j = left; j <= right; j++){res[top][j] = num++;}top++;//右:从上到下-----i 从 top ---> bottomfor(int i = top; i <= bottom; i++){res[i][right] = num++;}right--;if(top <= bottom){//下:从右到左-----j 从 right ---> leftfor(int j = right; j >= left; j--){res[bottom][j] = num++;}bottom--;}if(left <= right){//左:从下到上-----i 从 bottom ---> topfor(int i = bottom; i >= top; i--){res[i][left] = num++;}left++;}}return res;}
}

方法3:“循环画框”

class Solution {public int[][] generateMatrix(int n) {    int loopCur = 1;        //当前所处的圈数int loopCnt = n / 2;    //所需绘制的完整圈数int xStart = 0;         //横坐标的开始坐标int yStart = 0;         //纵坐标的开始坐标int offset = 1;         //当前绘制圈的偏置值int num =  1;           //当前绘制的数字int i,j;                //绘制地图用的横纵坐标int[][] res = new int[n][n];while(loopCur <= loopCnt){//上:从左往右-----j 从 yStart ---> n-offsetfor(j = yStart; j < n-offset; j++){res[xStart][j] = num++;}//右:从上到下-----i 从 xStart ---> n-offsetfor(i = xStart; i < n-offset; i++){res[i][j] = num++;}//下:从右到左-----j 递减到 yStart+1for(; j > yStart; j--){res[i][j] = num++;}//左:从下到上-----i 递减到 xStart+1for(; i > xStart; i--){res[i][j] = num++;}offset++;   //调整偏置值loopCur++;xStart++;yStart++;}if(1 == n%2){res[xStart][yStart] = num;}return res;}
}

 (2)矩形样式的螺旋矩阵

        54.螺旋矩阵

方法1:点模拟

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res = new ArrayList<Integer>();if(matrix == null){return res;}int rows = matrix.length;int cols = matrix[0].length;int cnt = rows * cols;if (rows == 0 || cols == 0) {return res;}int curRow = 0;int curCol = 0;int dirIndex = 0;int[][] dirs = {{0,1}, {1,0}, {0,-1}, {-1,0}};boolean[][] visited = new boolean[rows][cols];while(cnt > 0){res.add(matrix[curRow][curCol]);visited[curRow][curCol] = true;//判定后续位置是否越界int nextRow = curRow + dirs[dirIndex][0];int nextCol = curCol + dirs[dirIndex][1];//需要加一个res[nextRow][nextCol] != 0 因为走了一圈之后就回到了原点,需要避免回原点,而是调整方向//比如三阶矩阵中的最后9,若不调整方向,则会放到原点处if(nextRow < 0 || nextRow > rows-1 || nextCol < 0 || nextCol > cols-1 || visited[nextRow][nextCol] != false){dirIndex = (dirIndex+1) % 4;}curRow = curRow + dirs[dirIndex][0];curCol = curCol + dirs[dirIndex][1];cnt--;}return res;}
}

方法2:层模拟

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res = new ArrayList<Integer>();if(matrix == null){return res;}int rows = matrix.length;int cols = matrix[0].length;if (rows == 0 || cols == 0) {return res;}int top = 0;int bottom = rows -1;int left = 0;int right = cols -1;while(top <= bottom && left <= right){//上:从左到右for(int j = left; j <= right; j++){res.add(matrix[top][j]);}top++;//右:从上到下for(int i = top; i <= bottom; i++){res.add(matrix[i][right]);}right--;//下:从右到左if(top <= bottom){  //若不判断,遇见单行,则会重复处理for(int j = right; j >= left;j--){res.add(matrix[bottom][j]);}}bottom--;//左:从下到上if(left <= right){  //若不判断,遇见单列,则会重复处理for(int i = bottom; i >= top; i--){res.add(matrix[i][left]);}}left++;}return res;}
}

方法3: “循环画框”--错误代码演示,没改出来

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res = new ArrayList<Integer>();int rows = matrix.length;int cols = matrix[0].length;int loopCur = 1;int loopCnt = rows/2 + 1;    //为便捷处理中心区域的多个数据int xStart = 0;int yStart = 0;int offset = 1;//因为增加了圈数,导致单行的矩阵会重复打印if(rows == 1){for(int temp = 0; temp < cols; temp++){res.add(Integer.valueOf(matrix[0][temp]));}return res;}//因为增加了圈数,导致单列的矩阵会重复打印if(cols == 1){for(int temp = 0; temp < rows; temp++){res.add(Integer.valueOf(matrix[temp][0]));}return res;}int i,j;while(loopCur <= loopCnt){//上:从左到右for(j = yStart; j < cols-offset; j++){res.add(matrix[xStart][j]); }//右:从上到下for(i = xStart; i < rows-offset; i++){res.add(matrix[i][j]);}//下:从右到左for(; j > yStart; j--){res.add(matrix[i][j]);}//左:从下到上for(; i > xStart; i--){res.add(matrix[i][j]);}offset++;loopCur++;xStart++;yStart++;}if(rows == cols && rows%2 ==1){res.add(matrix[xStart-1][yStart-1]);}return res;}
}

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

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

相关文章

从Manus到OpenManus:AI智能体技术如何重塑未来生活场景?

从Manus到OpenManus&#xff1a;AI智能体技术如何重塑未来生活场景&#xff1f; 一、现状&#xff1a;AI智能体技术面临的三大核心矛盾 &#xff08;通过分析用户高频痛点与市场反馈提炼&#xff09; 能力与门槛的失衡 Manus展示的复杂任务处理能力&#xff08;如股票分析、代…

迭代器与可迭代对象

概念层面&#xff1a; 可迭代对象&#xff1a; 一个可迭代对象是指任何可以返回一个迭代器的对象。换句话说&#xff0c;它实现了 __iter__() 方法 比如&#xff1a;列表、元组、字典、字符串、集合等 直接通过 for 循环使用&#xff0c;因为 for 循环内部会调用其 __iter__(…

总结PostgreSQL创建数据库失败的解决办法

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 系统环境是Windows 11 专业版&#xff0c;PostgreSQL版本是17。在运行sql语句创建数据库时出现错误&#xff1a; 閿欒: template database \"template1\" has a collation version mismatch DETAIL: Th…

Mybatis源码 插件机制

简介 插件是一种常见的扩展方式&#xff0c;大多数开源框架也都支持用户通过添加自定义插件的方式来扩展或者改变原有的功能&#xff0c;MyBatis中也提供的有插件&#xff0c;虽然叫插件&#xff0c;但是实际上是通过拦截器(Interceptor)实现的&#xff0c;在MyBatis的插件模块…

Android14 SystemUI中添加第三方AIDL

由于特殊需求&#xff0c;需要在SystemUI中添加第三方AIDL&#xff0c;去做一些客制化的修改。现在记录一下AIDL添加的过程。 1.将AIDL文件拷贝到frameworks/base/packages/SystemUI/src/下&#xff0c;我要添加的AIDL文件是com/test/myctr/IDevicectr.aidl&#xff0c;添加后的…

Binlog、Redo log、Undo log的区别

一、binlog和redo log的区别 特性binlogredo log记录对象记录的是 MySQL 服务器的事务操作&#xff0c;针对的是整个数据库实例。记录的是 InnoDB 存储引擎的数据页变化&#xff0c;针对的是具体的存储引擎层面。记录内容记录的是事务的逻辑操作&#xff0c;例如 SQL 语句&…

TDengine 中的异常恢复

简介 本章主要介绍在 TDengine 执行命令过程中发生异常&#xff0c;如何手工终于执行的任务。可以终止连接&#xff0c;线上查询及终止事务。 如果一个事务 在一个复杂的应用场景中&#xff0c;连接和查询任务等有可能进入一种错误状态或者耗时过长迟迟无法结束&#xff0c;…

全球化2.0 | ZStack举办香港Partner Day,推动AIOS智塔+DeepSeek海外实践

2025年3月21日&#xff0c;云轴科技ZStack在香港成功举办了主题为“ZStack AIOS 智塔与 DeepSeek 私有化方案介绍及企业应用落地实践”的 Partner Day 活动。此次活动吸引了众多海外合作伙伴&#xff0c;共同探讨 AI Infra 平台在企业私有化 AI 中的应用与价值闭环。 ZStack CT…

ERP、MES和CRM三大企业系统的详细介绍及对比分析

以下是关于ERP、MES和CRM三大企业系统的详细介绍及对比分析&#xff1a; 1. ERP&#xff08;企业资源计划&#xff0c;Enterprise Resource Planning&#xff09; 核心功能&#xff1a; 集成管理&#xff1a;财务、采购、库存、生产、人力资源等核心业务流程资源优化&#xf…

(二十)Dart 中的多态

Dart 中的多态教程 一、多态的概念 多态是面向对象编程中的一个重要概念。它允许将子类类型的指针赋值给父类类型的指针&#xff0c;同一个函数调用会有不同的执行效果。换句话说&#xff0c;子类的实例可以赋值给父类的引用。多态的核心在于父类定义一个方法不去实现&#x…

【C++初阶】第12课—list

文章目录 1. list的构造2. list迭代器的常见接口2.1 list遍历的迭代器接口2.2 list修改数据的迭代器接口2.3 list排序、逆序、合并相关操作的成员函数 3. 模拟实现list3.1 模拟实现list的构造3.2 模拟实现list的尾插3.3 模拟实现迭代器iterator3.4 模拟实现list的插入删除3.5 模…

思维链技术(Chain-of-Thought, CoT)

思维链&#xff08;Chain-of-Thought, CoT&#xff09;是一种通过模拟人类逐步推理过程来提升大型语言模型&#xff08;LLM&#xff09;复杂任务表现的技术。其核心思想是让模型在生成最终答案前&#xff0c;先输出中间推理步骤&#xff0c;从而增强逻辑性和可解释性。 1. 基础…

谷粒微服务高级篇学习笔记整理---异步线程池

多线程回顾 多线程实现的4种方式 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法实现多线程。 public class MyThread extends Thread {Overridepublic void run() {System.out.println("线程运行: " Thread.currentThread().getName());} }// 使用 pub…

Windows学习笔记(4)关于MITRE

基本术语 APT&#xff08;威胁组&#xff0c;高级持续威胁&#xff09; TTP&#xff08;攻击目的技术过程&#xff0c;战术技术和程序&#xff09; ATT&CK框架 网站 https://attack.mitre.org/ CAR知识库 MITRE Engage MITRE D3FEND 网址 https://d3fend.mitre.org/

Go 语言规范学习(2)

文章目录 VariablesTypesBoolean typesNumeric typesString typesArray typesSlice typesStruct typesPointer typesFunction typesInterface typesBasic interfacesEmbedded interfacesGeneral interfaces【泛型接口】Implementing an interface【实现一个接口】 Map typesCha…

创意 Python 爱心代码分享

创意 Python 爱心代码分享 在编程中&#xff0c;用代码表达创意和情感是一种非常有趣的方式。本文将分享几段用 Python 编写的爱心代码&#xff0c;涵盖简单到复杂的实现方式&#xff0c;适合初学者和进阶开发者。 1. 简单爱心图案 代码实现 print("\n".join([&qu…

NLP高频面试题(二十四)——RAG相关内容简介

检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称 RAG&#xff09;是一种将信息检索与生成模型相结合的技术&#xff0c;旨在提升大型语言模型的响应准确性、相关性和时效性。通过在生成过程中引入外部知识&#xff0c;RAG 能够有效弥补 LLM 在知识局限…

Share01-WinCC文件越用越大?

为什么你们的经典WinCC项目在客户电脑上运行的越来越慢&#xff1f;为什么查询一个历史曲线慢的要死&#xff1f;为什么重启一下电脑画面都要怀疑人生&#xff1f;具体原因可能多种多样&#xff0c;但是极大可能是您的数据管理设置欠佳&#xff0c;那么闲话少叙&#xff0c;和小…

练习题:111

目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 指定文件路径和名称&#xff1a; 定义要写入的内容&#xff1a; 打开文件并写入内容&#xff1a; 异常处理&#xff1a; 输出提示信息&#xff1a; 运行思路 结束语 Python题…

2025_0327_生活记录

昨晚正在玩手机&#xff0c;凌晨一点二十一分左右手机突然响起来&#xff0c;通知地震波将在5秒后到达海淀区。看着倒计时的数字不断减小&#xff0c;橙色预警页面不断闪动&#xff0c;床猛地摇了几下。那一刻&#xff0c;我的记忆被拉回了2008年。 上大学之前我在成都生活了1…