054.螺旋矩阵
作者:沉默王二
发布时间:2024-11-20T17:38:06.184+0800
2024 年 11 月 20 日这天,鲁迅定下了一个小目标,接下来连续更新 46 天,把 LeetCode 100 搞定,下面开始更新 Spring Boot 的教程,结合技术派一起来。今天先搞定 054.螺旋矩阵。
题意
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
难度
中等
示例
示例1:
textjavascripttypescriptcsshtmlbashjsonmarkdownpythonjavaccpprubygorustphpsqlyaml Copy
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例2:
textjavascripttypescriptcsshtmlbashjsonmarkdownpythonjavaccpprubygorustphpsqlyaml Copy
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
### 分析
按照螺旋顺序,可以看成一圈一圈地剥开矩阵:
从左到右(遍历当前上边界)。
从上到下(遍历当前右边界)。
从右到左(遍历当前下边界)。
从下到上(遍历当前左边界)。
每遍历完一圈,就需要缩小边界,直到所有元素都被遍历。
我们可以用 4 个变量 top, bottom, left, right 来分别表示上下左右的边界。
每次遍历一圈后,更新这些边界,直到 top > bottom 或 left > right。
textjavascripttypescriptcsshtmlbashjsonmarkdownpythonjavaccpprubygorustphpsqlyaml Copy
class Solution05401 {
public List
List
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return result;
}
int top = 0, bottom = matrix.length - 1; // 上下边界
int left = 0, right = matrix[0].length - 1; // 左右边界
while (top <= bottom && left <= right) {
// 从左到右遍历当前上边界
for (int i = left; i <= right; i++) {
result.add(matrix[top][i]);
}
top++; // 上边界缩小
// 从上到下遍历当前右边界
for (int i = top; i <= bottom; i++) {
result.add(matrix[i][right]);
}
right--; // 右边界缩小
// 从右到左遍历当前下边界(需要检查上下边界是否相交)
if (top <= bottom) {
for (int i = right; i >= left; i--) {
result.add(matrix[bottom][i]);
}
bottom--; // 下边界缩小
}
// 从下到上遍历当前左边界(需要检查左右边界是否相交)
if (left <= right) {
for (int i = bottom; i >= top; i--) {
result.add(matrix[i][left]);
}
left++; // 左边界缩小
}
}
return result;
}
public static void main(String[] args) {
Solution05401 solution = new Solution05401();
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
System.out.println(solution.spiralOrder(matrix)); // 输出: [1, 2, 3, 6, 9, 8, 7, 4, 5]
}
}
①、从左到右:遍历当前 top 行的 [left, right] 范围,添加元素后,top++。
②、从上到下:遍历当前 right 列的 [top, bottom] 范围,添加元素后,right--。
③、从右到左:如果 top <= bottom,遍历当前 bottom 行的 [right, left] 范围,添加元素后,bottom--。
④、从下到上:如果 left <= right,遍历当前 left 列的 [bottom, top] 范围,添加元素后,left++。
很好理解,来看一下题解效率:
总结
本题其实并不比简单题难多少,或者说,其实就是让你抓住 顺时针旋转 这个关键点,再依次缩小边界便可以解题了。
力扣链接:https://leetcode.cn/problems/spiral-matrix/
一步一个脚印
不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。
PDF 版本目前只针对二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 加入我们吧。
一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 6500 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!
语雀专栏地址+密码可通过星球置顶帖查看:https://t.zsxq.com/15rEo9Pdu
这道题可以说完全重写了,给出 1 道大家完全都能掌握的题解(暴力解法)。
增加代码注释,这样大家更容易看懂并掌握题解;
增加参考资料,这样大家可以从零基础直接开刷,减轻新手刷题的阻力;
增加手绘图,这样大家更容易理解解题思路;
增加 ACM 输入输出,这样大家可以在 Intellij IDEA 中进行调试;
增加题解模拟,这样大家可以根据题解模拟整个题解过程,看完会有一种“哦哦”恍然大悟的感觉;
图片上传至 OSS 并配合 CDN,提升大家在技术派网站中的阅读体感。
另外,这一版本会作为 PDF 的终稿随后在星球进行发布。