本文用于记录自己的学习思考,原算法来自代码随想录
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res (n, vector<int>(n,0));//由题目可知这是个二维数组
int i=0,j = 0; //设置x和y来遍历这个螺旋矩阵
int startX= 0,startY = 0; //记录每一圈x和y开始的位置
int offset = 1; //记录圈数,现在是第一圈
int count = 1; //记录数字
int loop = n/2; //记录总共的圈数
int mid = n / 2; //如果n是一个奇数,那么这个螺旋矩阵中间那一块就会空着,到时候用这个mid去填写它
while(loop -- ){
i = startX; //目前从[0,0]开始,等到下一次while开始,就是从[1,1]开始
j = startY;
for(;j < n - offset;j++){//加入n = 4,那么这个循环了一共遍历了res[0][0]、[0][1]、[0][2]
res[i][j] = count++;//我们先不处理[0][3],留到下一次for循环再来处理
}
for(;i < n - offset;i++){//开始处理[0,3][1,3],[2,3],同样的[3,3]留到下一次处理
res[i][j] = count ++;
}
for(;j > startY;j--){//处理[3,3][3,2][3,1],所以这里的j是要>startY(0)的
res[i][j] = count++;
}
for(;i > startX;i--){//处理[3,0][2,0][1,0],到目前为之最外面的一圈就处理完了,接下来处理里面那一圈
res[i][j] = count++;
}
startX ++;
startY++;
offset++;
}
if(n%2){//n是奇数的情况下,要单独地填入一个数字
res[mid][mid] = count;
}
return res;
}
};