LeetCode 第54题:螺旋矩阵

87 阅读3分钟

LeetCode 第54题:螺旋矩阵

题目描述

给你一个 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)思路简单空间消耗大

相关题目