给定一个正整数 n,生成一个包含 1 到 n*n 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
思路:
生成一个 n×n 空矩阵 mat,随后模拟整个向内环绕的填入过程:
定义当前左右上下边界 l,r,t,b,初始值 num = 1,迭代终止值 tar = n * n;
当 num <= tar 时,始终按照 从左到右 从上到下 从右到左 从下到上 填入顺序循环,每次填入后:
执行 num += 1:得到下一个需要填入的数字;
更新边界:例如从左到右填完后,上边界t += 1,相当于上边界向内缩 1。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int l = 0, r = n - 1, t = 0, b = n - 1;
vector<vector<int> > ret(n,vector<int>(n,0));
int num = 1, tar = n * n;
while(num <= tar)
{
//left to right
for(int i=l; i<=r; i++)
{
ret[t][i] = num++;
}
t++;
//top to bottom
for(int i=t; i<=b; i++)
{
ret[i][r] = num++;
}
r--;
//right to left
for(int i=r; i>=l; i--)
{
ret[b][i] = num++;
}
b--;
//bottom to top
for(int i=b; i>=t; i--)
{
ret[i][l] = num++;
}
l++;
}
return ret;
}
};