CanTechLab

Can

Leetcode:59. 螺旋矩阵 II

2024-05-16

Leetcode题目链接:59. 螺旋矩阵 II

题目描述:

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

题目示例:

示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

解题思路:

模拟矩阵

  • 定义位置starx,starty用于记录每圈的左上角位置,每执行完一次循环向右下角移动一个位置([ 0, 0 ] -> [ 1, 1 ])

  • 定义变量offset用于指定对当前生成外圈的四个边角位置的特殊处理

  • 定义i,j变量作为循环元素,matrix[ i ][ j ]即为当前所在元素的位置,对其进行赋值

  • 定义loop = n / 2 作为循环次数,定义mid = n / 2 作为该矩阵的中心位置(用于特殊处理中心位置元素)

  • 第一个for循环从左到右的方向处理第 startx 行(不包括右上角顶点元素)

  • 第二个for循环从上到下的方向处理最后第 n - offset 列(不包括右下角顶点元素)

  • 第三个for循环从右到左的方向处理最后第 n - offset 行(不包括左下角顶点元素)

  • 第四个for循环从下到上的方向处理第 starty 列(不包括左上角顶点元素)

  • 完成四次for循环后startx,starty,offset都 + 1,往内圈移动以生成新的内圈元素

  • 最后对矩阵进行特殊判断,若 n 为奇数,则对最中心元素进行赋值

我的答案:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> matrix(n, vector<int>(n, 0));
        int startx = 0,starty = 0,offset = 1;
        int i = 0,j = 0,num = 1;
        int loop = n / 2, mid = n / 2;
        while(loop--){
            i = startx;
            j = starty;

            for(j; j < n - offset; j++)
                matrix[i][j] = num++;
            for(i; i < n - offset; i++)
                matrix[i][j] = num++;
            for( ; j > starty; j--)
                matrix[i][j] = num++;
            for( ; i > startx; i--)
                matrix[i][j] = num++;
                
            startx++;
            starty++;
            offset++;
        }
        if(n % 2 == 1)matrix[mid][mid] = num;
        return matrix;
    }
};

提交结果: