给你一个正整数 n ,生成一个包含 1 到 n平方 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
这个题目需要先创建一个数组,C++的创建方式是vector<vector<int>> v(n,vector<int>(n,0));
如图所示螺旋的循环过程,比如最外一圈,此时是第一次循环,读取的位置【0,0~3】【0~3,4】 【4,4~1】 【4~1,0】
0~3的范围是由于n=5,从0开始计算就是0~4,然后减去最后一个格子,0代表的是第一圈;1和4都是连接前一行或者列
第二轮在第一轮的基础上往内压缩了一格,表现在0转变成1,然后范围将从0~3变成1~2
n为偶数和奇数时存在不同,奇数时需要将最后一个值填入其中。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> v(n,vector<int>(n,0));
int num=1;
int startX=0,startY=0;
int offset=1; //这个值用来更新起始位置,随着循环的次数递增
int loop=n/2; //循环次数,如果n是奇数,还剩最后一个没有循环
while(loop--){
for(int j=startY;j<n-offset;j++){
v[startX][j]=num++; //一个循环内第一行,注意num++,赋值的是n,然后n进行加1的操作
}
for(int i=startX;i<n-offset;i++){
v[i][n-offset]=num++; //一个循环内的第一列
}
for(int j=n-offset;j>startY;j--){
v[n-offset][j]=num++; //一个循环内的第二行
}
for(int i=n-offset;i>startX;i--){
v[i][startY]=num++; //一个循环内的第二列
}
startX++;
startY++;
offset+=1;
}
if (n % 2) { //n为奇数时,对最后一个值单独操作
int mid=n/2;
v[mid][mid] = num;
}
return v;
}
};