leetcode 59. 螺旋矩阵 II

Posted The August

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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]]

提示:

  • 1 <= n <= 20

思路:
模拟顺时针画矩阵的过程:

  • 从左到右填充上行
  • 从上到下填充右列
  • 从右到左填充下行
  • 从下到上填充左列


按照左闭右开的原则,每个箭头覆盖的长度表示一条边遍历的长度,可以看出每一条拐角处的处理规则,在拐角处开始画一条新的边,这里的左闭右开就是不变量,在循环中保持不变量,才能顺利的把这个圈画出来

代码如下:

class Solution 
public:
    vector<vector<int>> generateMatrix(int n) 
        vector<vector<int>> v;
        v.resize(n);
        for(int i=0;i<n;i++)
        
            v[i].resize(n);
        

        int startx=0;  //定义每循环一个圈的起始位置
        int starty=0;
        int loop=n/2;  //每个圈循环几次
        int mid=n/2;  //矩阵的中间位置
        int count=1;  //用来给矩阵每个位置赋值
        int offset=1;  //每一圈循环都需要控制每一条边遍历的长度
        while(loop)
        
            int j=startx;
            int i=starty;
            //从左到右
            for( ; j<n+startx-offset;j++)
            
                v[i][j]=count++;
            
            //从上到下
            for( ; i<n+starty-offset;i++)
            
                v[i][j]=count++;
            
            //从右到左
            for(;j>startx;j--)
            
                v[i][j]=count++;
            
            //从下到上
            for(;i>starty;i--)
            
                v[i][j]=count++;
            
            loop--;
            starty++;
            startx++;
            offset+=2;
        
        //如果n为奇数,则需要单独给矩阵最中间的位置赋值
        if(n%2==1)
        
            v[mid][mid]=n*n;
        
        return v;
    

;

“一进循环深似海,从此Offer是路人”

以上是关于leetcode 59. 螺旋矩阵 II的主要内容,如果未能解决你的问题,请参考以下文章

Python描述 LeetCode 59. 螺旋矩阵 II

Python描述 LeetCode 59. 螺旋矩阵 II

Leetcode 59. 螺旋矩阵 II(Spiral Matrix II)

LeetCode59. 螺旋矩阵 II

leetcode 59. 螺旋矩阵 II

leetcode 59. 螺旋矩阵 II