LeetCode 第59题:螺旋矩阵 II

121 阅读3分钟

LeetCode 第59题:螺旋矩阵 II

题目描述

给你一个正整数 n ,生成一个包含 1 到 n² 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

难度

中等

题目链接

点击在LeetCode中查看题目

示例

示例 1:

示例1

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

示例 2:

输入:n = 1
输出:[[1]]

提示

  • 1 <= n <= 20

解题思路

方法:模拟螺旋过程

这道题需要我们按照螺旋顺序填充数字。我们可以模拟整个螺旋过程,按照右、下、左、上的顺序依次填充数字。

关键点:

  1. 定义四个边界:上、下、左、右
  2. 按照固定的方向顺序填充:右→下→左→上
  3. 每填充完一个方向后,更新相应的边界
  4. 使用一个变量记录当前要填充的数字

具体步骤:

  1. 初始化 n×n 的矩阵
  2. 定义四个边界变量和当前填充的数字
  3. 当数字小于等于 n² 时,按照以下顺序填充:
    • 从左到右填充上边界
    • 从上到下填充右边界
    • 从右到左填充下边界
    • 从下到上填充左边界
  4. 每完成一个方向的填充,更新相应的边界

时间复杂度:O(n²),需要填充 n² 个格子 空间复杂度:O(1),不考虑返回的矩阵

代码实现

C# 实现

public class Solution {
    public int[][] GenerateMatrix(int n) {
        int[][] matrix = new int[n][];
        for (int i = 0; i < n; i++) {
            matrix[i] = new int[n];
        }
        
        int num = 1;
        int left = 0, right = n - 1;
        int top = 0, bottom = n - 1;
        
        while (num <= n * n) {
            // 从左到右
            for (int i = left; i <= right; i++) {
                matrix[top][i] = num++;
            }
            top++;
            
            // 从上到下
            for (int i = top; i <= bottom; i++) {
                matrix[i][right] = num++;
            }
            right--;
            
            // 从右到左
            for (int i = right; i >= left; i--) {
                matrix[bottom][i] = num++;
            }
            bottom--;
            
            // 从下到上
            for (int i = bottom; i >= top; i--) {
                matrix[i][left] = num++;
            }
            left++;
        }
        
        return matrix;
    }
}

执行结果

  • 执行用时:92 ms
  • 内存消耗:34.8 MB

代码亮点

  1. 🎯 使用四个边界变量控制填充范围
  2. 💡 按照固定的方向顺序填充,逻辑清晰
  3. 🔍 边界条件处理完善
  4. 🎨 代码结构简洁,易于理解

常见错误分析

  1. 🚫 边界更新顺序错误
  2. 🚫 循环条件判断不准确
  3. 🚫 方向转换时机不对
  4. 🚫 没有正确处理 n=1 的特殊情况

图解思路

填充过程示例(n=3)

第1步:     第2步:     第3步:     第4步:
1 2 3      1 2 3      1 2 3      1 2 3
. . 4      8 9 4      8 9 4      8 9 4
. . 5      7 6 5      7 6 5      7 6 5

说明:
1. 先填充第一行:1,2,3
2. 再填充最右列:4,5
3. 再填充最下行:6,7
4. 最后填充最左列:8
5. 最后填充中心:9

解法对比

解法时间复杂度空间复杂度优点缺点
模拟法O(n²)O(1)直观易理解,实现简单代码略显冗长
数学公式法O(n²)O(1)代码简洁不够直观,难以理解

相关题目