【矩阵专题】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)(不计输出结果所占空间)
相关推荐
WWZZ20258 分钟前
快速上手大模型:深度学习2(实践:深度学习基础、线性回归)
人工智能·深度学习·算法·计算机视觉·机器人·大模型·slam
初级炼丹师(爱说实话版)14 分钟前
算法面经常考题整理(1)机器学习
人工智能·算法·机器学习
旺仔小拳头..1 小时前
Maven相关
java·maven
要一起看日出1 小时前
数据结构---------红黑树
java·数据结构·红黑树
被AI抢饭碗的人1 小时前
算法题(246):负环(bellman_ford算法)
算法
程序定小飞1 小时前
基于springboot的民宿在线预定平台开发与设计
java·开发语言·spring boot·后端·spring
FREE技术1 小时前
山区农产品售卖系统
java·spring boot
大数据张老师2 小时前
数据结构——折半查找
数据结构·算法·查找·折半查找
星光一影2 小时前
Java医院管理系统HIS源码带小程序和安装教程
java·开发语言·小程序
YA3332 小时前
java设计模式七、代理模式
java·设计模式·代理模式