leetcode59. 螺旋矩阵 II

题目描述

给你一个正整数 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循环的特殊性。

你可能感兴趣的:(数组,力扣刷题,leetcode,数据结构)