【矩阵专题】Leetcode54.螺旋矩阵(Hot100)

螺旋矩阵

一、题目描述

给你一个 m x n 的矩阵 matrix,请按照螺旋顺序返回矩阵中的所有元素。

示例:

输入:

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

输出:

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

二、解题思路:模拟"画圈圈"的过程

这道题最直接的做法是模拟"从外到内逐层遍历"的过程,也就是四个方向依次遍历

  • 从左到右遍历顶部行
  • 从上到下遍历右侧列
  • 从右到左遍历底部行
  • 从下到上遍历左侧列

然后不断地收缩边界,直到遍历完整个矩阵。


三、图解说明

如下图所示(以 3x3 矩阵为例):

复制代码
[ 1 → 2 → 3 ]
[ ↓       ↓ ]
[ 4       6 ]
[ ↓       ↑ ]
[ 7 ← 8 ← 9 ]

我们用四个变量控制边界:

  • left:左边界
  • right:右边界
  • top:上边界
  • bottom:下边界

每遍历完一圈,就收缩对应边界,直到 left > righttop > bottom


四、Java 代码实现

java 复制代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int left = 0;
        int right = matrix[0].length - 1;
        int top = 0;
        int bottom = matrix.length - 1;

        List<Integer> ans = new ArrayList<>();

        while (left <= right && top <= bottom) {
            // 从左到右
            for (int i = left; i <= right; i++) {
                ans.add(matrix[top][i]);
            }
            top++; // 上边界下移

            // 从上到下
            for (int i = top; i <= bottom; i++) {
                ans.add(matrix[i][right]);
            }
            right--; // 右边界左移

            // 从右到左(确保当前还有未遍历的行)
            if (top <= bottom) {
                for (int i = right; i >= left; i--) {
                    ans.add(matrix[bottom][i]);
                }
                bottom--; // 下边界上移
            }

            // 从下到上(确保当前还有未遍历的列)
            if (left <= right) {
                for (int i = bottom; i >= top; i--) {
                    ans.add(matrix[i][left]);
                }
                left++; // 左边界右移
            }
        }

        return ans;
    }
}

五、特别说明:两个 if 判断的作用

这两个判断是避免重复遍历或越界的关键。

if (top <= bottom) 的作用:

在执行"从右向左遍历"前,需要确保还有剩余的未访问行

比如只有一行时,从左到右遍历后,top++,就可能已经超过 bottom,这时就不能再从右往左遍历了。

if (left <= right) 的作用:

在执行"从下向上遍历"前,需要确保还有剩余的未访问列

同理,如果只剩下一列,执行完"从上到下"后,right-- 可能已经小于 left,就不能再从下向上了。


六、复杂度分析

  • 时间复杂度: O(m * n)
    每个元素都被访问一次。
  • 空间复杂度: O(1)(不计输出结果所占空间)
相关推荐
爱刷碗的苏泓舒1 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
维天说2 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19942 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了3 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品3 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘3 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记4 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端
烬羽4 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
糖果店的幽灵4 小时前
langgraph的 MessagesState 解读
java·开发语言·人工智能·windows·langgraph
闪电悠米4 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法