给你一个正整数?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
题解:
这是一道比较复杂的模拟题。问题关键在于找到不变的规则和改变的变量。
我们可以发现这是按照圈来转的,就是比如说,第一行先按顺序走一遍,然后最右边这一列,最下面这一行,第一列。
如此顺序的话,就决定了一定要有四个循环,那么如何处理这四个循环。
每次循环,我们可以采取左开右闭或者左闭右开(一个循环只处理左端点不处理右端点,或者是只处理右端点不处理左端点),每个循环都应该是一样的规则,我们这里选取左闭右开的原则。
需要注意的是,每一圈处理之后,要改变下一次的每一行或每一列长度,所以还需要加一个变量,控制偏移量。
这样我们在最外面只需要一个while控制圈数就可以了。
对于中间那个结点,奇数需要额外处理,偶数不需要,所以在最后判断一下,如是奇数,就把那个位置单独赋值。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int i,j,startx = 0,starty = 0,count = 1,offset = 1,loop = n/2,mid = n/2;
vector<vector<int>> res(n,vector<int>(n,0));
while(loop--){
i = startx;
j = starty;
for(j = starty;j < n-offset;j ++){
res[startx][j] = count++;
}
for(i = startx;i < n-offset; i ++){
res[i][j] = count++;
}
for(;j > starty;j --){
res[i][j] = count++;
}
for(;i > startx;i --){
res[i][j] = count++;
}
startx++;
starty++;
offset++;
}
if(n%2){
res[mid][mid] = count;
}
return res;
}
};