1210 字
约 4 分钟
6
054.螺旋矩阵
无标签

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 spiralOrder(int[][] matrix) {
List result = new ArrayList<>();

    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 的终稿随后在星球进行发布。

技术派阅读地址:https://paicoding.com/column/7/54

054.螺旋矩阵
https://clxhxhhr.top/posts/2479/
作者
clxstart
发布于
2026-09-19
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。
☰ 文章目录