LeetCode 第59题:螺旋矩阵 II
题目描述
给你一个正整数 n ,生成一个包含 1 到 n² 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
难度
中等
题目链接
示例
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
提示
1 <= n <= 20
解题思路
方法:模拟螺旋过程
这道题需要我们按照螺旋顺序填充数字。我们可以模拟整个螺旋过程,按照右、下、左、上的顺序依次填充数字。
关键点:
- 定义四个边界:上、下、左、右
- 按照固定的方向顺序填充:右→下→左→上
- 每填充完一个方向后,更新相应的边界
- 使用一个变量记录当前要填充的数字
具体步骤:
- 初始化 n×n 的矩阵
- 定义四个边界变量和当前填充的数字
- 当数字小于等于 n² 时,按照以下顺序填充:
- 从左到右填充上边界
- 从上到下填充右边界
- 从右到左填充下边界
- 从下到上填充左边界
- 每完成一个方向的填充,更新相应的边界
时间复杂度: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
代码亮点
- 🎯 使用四个边界变量控制填充范围
- 💡 按照固定的方向顺序填充,逻辑清晰
- 🔍 边界条件处理完善
- 🎨 代码结构简洁,易于理解
常见错误分析
- 🚫 边界更新顺序错误
- 🚫 循环条件判断不准确
- 🚫 方向转换时机不对
- 🚫 没有正确处理 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) | 代码简洁 | 不够直观,难以理解 |
相关题目
- LeetCode 54. 螺旋矩阵 - 中等
- LeetCode 885. 螺旋矩阵 III - 中等
- LeetCode 2326. 螺旋矩阵 IV - 中等