题目(leecode T59):给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
方法:手工模拟行为
思路:本题没有什么太深奥的算法思路,就是纯纯考验对于基础代码循环等的掌握能力。让我想到了刚开始学习C语言时必做的经典题打印一个棱形出来(感觉都是考察在循环相对比较复杂时能不能理清每个变量代表的是什么正在完成哪一部分工作)。所以就是手工模拟写一个矩阵出来,最上面一行从左到右,最右边一行是从上到下,最下面一行是从右到左,最左边一行是从下到上。
图中每一条边上不同颜色的格子代表一个for循环控制的,特别需要注意的是和二分法一样,需要注意循环不变量的原则,本题统一写成左闭右开的风格。
题解:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int startx = 0, starty = 0; //定义每一圈的起始位置的坐标,第一圈是0,0
int offset = 1; //每一条边的填入数字的个数
int count = 1; //填入的数字从1开始
int loop = n/2; //定义要画几圈
int mid = n/2; //定义最中心的位置,如果是奇数,会剩一个中心
while(loop--){
int i = startx;
int j = starty;
for(j; j < n - offset; j++){ //画上
res[i][j] = count++;
}
for(i; 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+=1; //每往里一圈,填入数字个数都会少一个
}
if(n%2 == 1){
res[mid][mid] = count; //单独判断n为奇数的情况
}
return res;
}
};