题目描述
给你一个正整数 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 = 0starty = 0offset = 1count = 1loop = n // 2 # // 表示整除,一个 / 结果带了小数while loop!=0:i = startxj = startyfor j in range(starty, n-offset):res[startx][j] = countcount += 1for i in range(startx, n-offset):res[i][n-offset] = count # 由于上一个循环j的值在最后一次循环不会+1,因此这里要用n-offset的下标count += 1for j in range(n-offset, starty, -1):res[n-offset][j] = count # 同理,上一个循环i的值最后一次不会+1,因此用n-offsetcount += 1for i in range(n-offset, startx, -1):res[i][starty] = count # 这里也是上一个循环j最后一次没有-1,因此要用startycount += 1offset += 1startx += 1starty += 1loop -= 1if n % 2 == 1:res[n//2][n//2] = countreturn res
从两个版本的代码可以看出,其实c++的代码中的res[ ][ ]的下标可以改成跟python中的res[ ][ ]一样,之所以可以用 i, j 来表示,是因为for循环的特殊性。