题目描述
给你一个正整数 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
分析思路
此题是一个中等题,比较绕。在草稿上模拟的时候,一定要遵循某种规律进行,例如我们采用左闭右开的原则处理每一条边,每次循环都是包含起始值,不包含终止值,(重点:如果在循环中遇到了改变的量,那就定义它为一个**变量!!!**需要成为刻板印象,如本题中的offset)。cpp代码如下:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0)); // 定义一个n和n列的二维数组
int startx = 0, starty = 0;
int offset = 1; // 需要控制每一条边遍历的长度,每次循环一遍就要+1,它是个变量!
int loop = n / 2; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
int i,j;
int count = 1;
while(loop--){
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==1){ // 如果是奇数,单独处理最中间的值
res[n/2][n/2] = count;
}
return res;
}
};
补充一个python版本的代码:
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
res = [[0] * n for _ in range(n)]
startx = 0
starty = 0
offset = 1
count = 1
loop = n // 2 # // 表示整除,一个 / 结果带了小数
while loop!=0:
i = startx
j = starty
for j in range(starty, n-offset):
res[startx][j] = count
count += 1
for i in range(startx, n-offset):
res[i][n-offset] = count # 由于上一个循环j的值在最后一次循环不会+1,因此这里要用n-offset的下标
count += 1
for j in range(n-offset, starty, -1):
res[n-offset][j] = count # 同理,上一个循环i的值最后一次不会+1,因此用n-offset
count += 1
for i in range(n-offset, startx, -1):
res[i][starty] = count # 这里也是上一个循环j最后一次没有-1,因此要用starty
count += 1
offset += 1
startx += 1
starty += 1
loop -= 1
if n % 2 == 1:
res[n//2][n//2] = count
return res
从两个版本的代码可以看出,其实c++的代码中的res[ ][ ]的下标可以改成跟python中的res[ ][ ]一样,之所以可以用 i, j 来表示,是因为for循环的特殊性。