螺旋矩阵II
螺旋矩阵II
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
| 1 | 2 | 3 |
|---|---|---|
| 8 | 9 | 4 |
| 7 | 6 | 5 |
这题并没有涉及什么算法,就是模拟过程,关键是清楚处理流程,这个过程是围绕边转圈来进行的。首先,需要清楚转几圈,我们知道,转一圈会使边减2,三维方阵转了一圈,最后就剩下一个元素了,所以得到结果转loop = n / 2圈,如果是奇数,那么最后将剩下的补上就行;其次,我们填充数的时候要注意遵循循环不变量的原则,这里用左闭右开,这样思路就清晰多了。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
std::vector<vector<int>> nums(n,vector<int>(n,0));
int startx = 0, starty = 0; // 起始点 转了一圈都会+1
int offset = 1, num = 1; // offset-> 左闭右开 num-> 计数
int i,j; // row col
int loop = n / 2; // 循环次数
while(loop--){
i = startx, j = starty;
for(; j < n-offset; ++j){
nums[startx][j] = num++;
}
for(; i < n-offset; ++i){
nums[i][j] = num++;
}
for(; j > starty; --j){
nums[i][j] = num++;
}
for(; i > startx; --i){
nums[i][starty] = num++;
}
++startx;
++starty;
++offset;
}
if(n%2 == 1){ // 如果是奇数,需要处理中心的元素
int mid = n / 2;
nums[mid][mid] = n * n;
}
return nums;
}
};

浙公网安备 33010602011771号