LeetCode 59. 螺旋矩阵 II
题目描述
给定正整数 n,构造一个 n×n 的方阵,按顺时针螺旋顺序填入 1 到 n² 的所有整数。
示例
输入:3
输出:
[
[1, 2, 3],
[8, 9, 4],
[7, 6, 5]
]
解题思路
模拟顺时针填充过程,通过维护四条边界逐步收缩:
- 初始化 :创建
n×n矩阵,设定初始边界top=0,bottom=n-1,left=0,right=n-1 - 分层填充 :
- 上层 :从左到右填充
top行,完成后top++ - 右层 :从上到下填充
right列,完成后right-- - 下层 :从右到左填充
bottom行,完成后bottom-- - 左层 :从下到上填充
left列,完成后left++
- 上层 :从左到右填充
- 终止条件 :当填充数字超过
n²时结束
代码实现
java
class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int num = 1, max = n * n;
int top = 0, bottom = n - 1, left = 0, right = n - 1;
while (num <= max) {
// 上层:从左到右
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;
}
}
复杂度分析
- 时间复杂度:O(n²) --- 每个元素被访问一次
- 空间复杂度:O(n²) --- 存储结果矩阵