LeetCode Hot100(15/100)——54. 螺旋矩阵

文章目录

题目链接:LeetCode CN - 螺旋矩阵


一、题目描述

给定一个 m x n 的二维矩阵 matrix,请按照 顺时针螺旋顺序 返回该矩阵中的所有元素。

示例输入:

复制代码
matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

示例输出:

复制代码
[1, 2, 3, 6, 9, 8, 7, 4, 5]

二、思路讲解

我们需要按照螺旋的顺序遍历矩阵------即 从左到右、从上到下、从右到左、从下到上 依次循环,直到所有元素都被访问完。


三、可视化流程解析

可以将矩阵的边界设定为四个变量:

  • top:当前剩余部分的上边界;
  • bottom:当前剩余部分的下边界;
  • left:当前剩余部分的左边界;
  • right:当前剩余部分的右边界。

每一次循环遍历,按照以下顺序访问元素:

  1. 从左到右;
  2. 从上到下;
  3. 从右到左;
  4. 从下到上;
  5. 缩小边界范围。

Mermaid 流程图(螺旋遍历过程)





开始
是否已遍历完所有元素?
从左到右遍历 top 行
从上到下遍历 right 列
是否剩余多行多列?
从右到左遍历 bottom 行
从下到上遍历 left 列
缩小边界 top++, bottom--, left++, right--
结束


Mermaid 思维导图(整体思路)

螺旋矩阵
思路
定义四个边界
按顺序遍历
每次循环收缩边界
实现
条件判断防止越界
使用 while 循环遍历
时间复杂度
O(m*n)
空间复杂度
O(1)


四、逐步实例演示

以如下矩阵为例:

复制代码
[
 [1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]
]
步骤 遍历方向 遍历元素 结果数组
1 从左到右 1, 2, 3 1, 2, 3
2 从上到下 6, 9 1, 2, 3, 6, 9
3 从右到左 8, 7 1, 2, 3, 6, 9, 8, 7
4 从下到上 4 1, 2, 3, 6, 9, 8, 7, 4
5 再次从左到右 5 1, 2, 3, 6, 9, 8, 7, 4, 5

完成遍历。


五、Java 实现代码

java 复制代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        if (matrix == null || matrix.length == 0) return res;

        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++) {
                res.add(matrix[top][i]);
            }
            top++;

            // 从上到下
            for (int i = top; i <= bottom; i++) {
                res.add(matrix[i][right]);
            }
            right--;

            // 判断剩余是否还有行或列
            if (top <= bottom) {
                // 从右到左
                for (int i = right; i >= left; i--) {
                    res.add(matrix[bottom][i]);
                }
                bottom--;
            }

            if (left <= right) {
                // 从下到上
                for (int i = bottom; i >= top; i--) {
                    res.add(matrix[i][left]);
                }
                left++;
            }
        }

        return res;
    }
}

六、复杂度分析

项目 说明 复杂度
时间复杂度 每个元素被访问一次 O(m × n)
空间复杂度 除输出外无额外存储 O(1)

七、总结

  • 关键思想:利用四个边界控制螺旋遍历;
  • 循环条件top <= bottom && left <= right
  • 注意点
    1. 每个方向遍历后需及时更新边界;
    2. 防止重复访问或越界。

这种思路是矩阵模拟类题型典型的"层层收缩"模型,掌握后可以轻松应用于类似题目(如「螺旋矩阵 II」生成题)。

相关推荐
大明者省9 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
白狐_79810 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25811 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记11 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI11 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型12 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光12 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
叠层归一研究院13 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
zlinear数据采集卡14 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
杨石兴14 小时前
31、玩具MoM:用2x2矩阵串起全套流程
人工智能·算法·矩阵·电磁学