已解答
中等
相关标签
相关企业
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
提示:
1 <= n <= 20
顺时针螺旋矩阵生成思路
核心思想
模拟顺时针螺旋填充的过程,通过动态调整边界实现从外向内逐层填充。使用四个边界指针(top, bottom, left, right)控制填充范围,按照“右→下→左→上”的顺序循环填充。
关键步骤
初始化:
创建 n×n 矩阵并初始化为0
设置边界指针:
top = 0
(上边界)bottom = n-1
(下边界)left = 0
(左边界)right = n-1
(右边界)
设置起始数字
start = 1
复杂度分析
时间复杂度:O(n²)
需要精确填充 n² 个元素,每个元素操作时间复杂度 O(1)空间复杂度:O(n²)
存储结果矩阵所需空间,无额外空间消耗
该算法通过边界指针的动态调整,高效实现了螺旋填充过程,完美处理了各种边界情况和矩阵尺寸(包括奇偶尺寸)。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
int top = 0, bottom = n - 1, left = 0, right = n - 1;
int start = 1; // 从1开始填充
while (start <= n * n)
{
for (int i = left; i <= right; i++)
{
res[top][i] = start;
start++;
}
top++;
for (int i = top; i <= bottom; i++)
{
res[i][right] = start;
start++;
}
right--;
for (int i = right; i >= left; i--) {
res[bottom][i] = start;
start++;
}
bottom--;
for (int i = bottom; i >= top; i--)
{
res[i][left] = start;
start++;
}
left++;
}
return res;
}
};