Article / 文章

LeetCode 第54题:螺旋矩阵

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

题目描述

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

难度

中等

题目链接

点击在LeetCode中查看题目

示例

示例 1:

示例1 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]

示例 2:

示例2 输入: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]

提示

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

解题思路

边界模拟法

这道题的关键是按照螺旋顺序遍历矩阵,我们可以通过维护四个边界,按照右、下、左、上的顺序遍历。

关键点:

  1. 维护四个边界:上、下、左、右
  2. 按照固定顺序遍历:右→下→左→上
  3. 每遍历完一个方向,更新对应的边界
  4. 注意处理单行或单列的特殊情况

具体步骤:

  1. 初始化边界值和结果列表
  2. 当还有元素未遍历时:
    • 从左到右遍历上边界
    • 从上到下遍历右边界
    • 从右到左遍历下边界(如果还有行)
    • 从下到上遍历左边界(如果还有列)
  3. 返回结果列表

图解思路

算法步骤分析表

步骤 方向 边界更新 遍历元素 说明
初始 - top=0,bottom=2,left=0,right=2 [] 开始状态
第1步 top++ [1,2,3] 遍历上边界
第2步 right– [1,2,3,6,9] 遍历右边界
第3步 bottom– [1,2,3,6,9,8,7] 遍历下边界
第4步 left++ [1,2,3,6,9,8,7,4,5] 遍历左边界

状态/情况分析表

情况 输入 输出 说明
1×1矩阵 [[1]] [1] 最简单情况
1×n矩阵 [[1,2,3]] [1,2,3] 单行情况
m×1矩阵 [[1],[2],[3]] [1,2,3] 单列情况

代码实现

C# 实现

public class Solution {
    public IList<int> SpiralOrder(int[][] matrix) {
        var result = new List<int>();
        
        if (matrix == null || matrix.Length == 0) return result;
        
        int top = 0;
        int bottom = matrix.Length - 1;
        int left = 0;
        int 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;
    }
}

执行结果

  • 执行用时:132 ms
  • 内存消耗:40.1 MB

代码亮点

  1. 🎯 边界条件处理清晰
  2. 💡 代码结构有序,易于理解
  3. 🔍 优化了单行单列的处理
  4. 🎨 变量命名直观明确

常见错误分析

  1. 🚫 边界更新顺序错误
  2. 🚫 没有处理单行或单列情况
  3. 🚫 边界条件判断不当
  4. 🚫 遍历方向搞错

解法对比

解法 时间复杂度 空间复杂度 优点 缺点
边界模拟 O(mn) O(1) 直观易懂 边界较多
方向数组 O(mn) O(1) 代码简洁 不易理解
标记访问 O(mn) O(mn) 思路简单 空间消耗大

相关题目