原题如下:
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
问题:
本文只针对算法视频公开课中出现的问题,在代码随想录网站中的代码是正确的。
Carl哥在算法视频公开课中提到,当输入n为奇数时,矩阵中心元素需要用i和j为下标去赋值。
循环片段代码如下:
while (loop --) {
i = startx;
j = starty;
// 下面开始的四个for就是模拟转了一圈
// 模拟填充上行从左到右(左闭右开)
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++;
}
// 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
startx++;
starty++;
// offset 控制每一圈里每一条边遍历的长度
offset += 1;
}
以n=3为例,在最后执行以下代码后,
if(n % 2){
res[i][j] = count;
}
输出矩阵为:
[[9, 2, 3],
[8, 0, 4],
[7, 6, 5]]
与答案给出的:
[[1, 2, 3],
[8, 9, 4],
[7, 6, 5]]
不符。
解释:
因为n=3,n/2=1,所以只执行一次循环,可以知道当执行完循环后,i和j都等于0,并非如视频中所说,i和j正好指向中心元素,这里是[1, 1]。
因此最后应该改成:
res[n/2][n/2] = count;