Day14:顺时针打印矩阵

news/2025/3/13 5:26:59/

给定一个二维数组 array,请返回「螺旋遍历」该数组的结果。

螺旋遍历:从左上角开始,按照 向右向下向左向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素。

示例 1:

输入:array = [[1,2,3],[8,9,4],[7,6,5]]
输出:[1,2,3,4,5,6,7,8,9]

示例 2:

输入:array  = [[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]
输出:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

LCR 146. 螺旋遍历二维数组 - 力扣(LeetCode) 

这是一个循环嵌套循环的问题,需要理清楚再写。

class Solution {public int[] spiralArray(int[][] array) {if (array == null || array.length == 0 || array[0].length == 0) {return new int[0]; // 如果数组为空,返回空数组}int X = array.length;int Y = array[0].length;int startX = 0;int endX = X - 1;int startY = 0;int endY = Y - 1;int[] result = new int[X*Y];int index = 0;while(startX <= endX && startY <= endY){for(int i = startY; i <= endY; i++){result[index] = array[startX][i];index++;}startX++;for(int j = startX; j <= endX; j++){result[index] = array[j][endY];index++;}endY--;for(int k = endY; k >= startY; k--){result[index] = array[endX][k];index++;}endX--;for(int l = endX; l >= startX; l--){result[index] = array[l][startY];index++;}startY++;}return result;}
}

这是我第一遍写的代码,数组边界搞懵逼了好几次,这个题目还是需要搞懂数组边界情况。然后这个代码在遇到{[2,3]}这种单列矩阵的时候报错了。

对于单行和单列的矩阵,你第一个循环把第一行或者第一列遍历完,但是后续的三个循环还是会执行,比如{{2,3,4,5}这个单行矩阵,第一个循环结束是2345,然后第二个循环不执行,第三个循环就会从endY = 3 开始遍历如果我们限定数组长度就会生越界。需要在下面的三个循环外面加上判断条件防止重复遍历。改完后代码如下:

class Solution {public int[] spiralArray(int[][] array) {if (array == null || array.length == 0 || array[0].length == 0) {return new int[0]; // 如果数组为空,返回空数组}int X = array.length;int Y = array[0].length;int startX = 0;int endX = X - 1;int startY = 0;int endY = Y - 1;int[] result = new int[X*Y];int index = 0;while(startX <= endX && startY <= endY){for(int i = startY; i <= endY; i++){result[index] = array[startX][i];index++;}startX++;for(int j = startX; j <= endX; j++){result[index] = array[j][endY];index++;}endY--;if(startX <= endX){for(int k = endY; k >= startY; k--){result[index] = array[endX][k];index++;}endX--;}if(startY <= endY){for(int l = endX; l >= startX; l--){result[index] = array[l][startY];index++;}startY++;}}return result;}
}


http://www.ppmy.cn/news/1578707.html

相关文章

[mybatis]resultMap详解

resultMap Mybatis中提供了resultMap功能&#xff0c;可以将数据库查询结果映射到Java对象&#xff0c;用于解决 字段名与属性名不一致 或 复杂关系&#xff08;如一对多&#xff09;的映射问题。 比如一个User类&#xff0c;在它的属性里还有另一个子对象&#xff08;或者多…

mysql索引机制深度剖析

目录 引言 1. 没有索引&#xff0c;可能会有什么问题 2. 认识磁盘 3. MySQL 与磁盘交互基本单位 4. 建立共识 5. 索引的理解 聚簇索引 VS 非聚簇索引 6. 索引操作 创建主键索引 唯一索引的创建 普通索引的创建 全文索引的创建 删除索引 索引创建原则 引言 本文将…

JavaEE进阶(2) Spring Web MVC: Session 和 Cookie

1. 什么是 Cookie 和 Session&#xff1f; 在 Web 开发中&#xff0c;Cookie 和 Session 是两种常见的会话管理技术。它们的主要区别在于存储位置和管理方式。 Cookie Cookie 是存储在客户端&#xff08;浏览器&#xff09;的一小段文本信息。由服务器发送并存储在客户端&am…

【Linux docker】关于docker启动出错的解决方法。

无论遇到什么docker启动不了的问题 就是 查看docker状态sytemctl status docker查看docker日志sudo journalctl -u docker.service查看docker三个配置文件&#xff08;可能是配置的时候格式错误&#xff09;&#xff1a;/etc/docker/daemon.json&#xff08;如果存在&#xf…

面试之《vue常见考题》

以下为你从基础概念、指令与组件、响应式原理、路由与状态管理等方面列举一些常见的 Vue 面试题及简要回答&#xff1a; 基础概念 什么是 Vue.js&#xff0c;它有什么特点&#xff1f; 回答&#xff1a;Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。特点包括易用…

代码随想录 回溯

131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 这题挺难的&#xff0c;搞了两个小时才一知半解吧qaq 思路&#xff1a;首先要明白什么作为终止条件&#xff0c;其次就是for循环内什么时候插入path&#xff0c;剩下的就是套模板了&#xff0c;其次补充一下回文数的…

Python----数据可视化(Seaborn三:绘图二)

一、小提琴图 提琴图的作用与箱形须线图类似。它显示了 数据点按一个&#xff08;或多个&#xff09;变量分组后的分布情况。 与箱图不同的是&#xff0c;每一个小提琴图都是通过对基础分布的核密度估计来绘制的。 方法 violinplot方法 绘制单图小提琴 catplot方法 绘制多图小…

redis趣味解读

redis 学习cpu给数据库也增加一个缓存 把数据都记录在内存 把数据都记录在内存中&#xff0c;不用去记录慢如蜗牛的I/O操作&#xff0c;执行redis缓存查询节省不少时间 定期删除 设置多少时间&#xff0c;交给应用程序自己设置 redis执行把过期内存删除&#xff0c;100ms就做…