59. 螺旋矩阵 II

发布时间:2023年12月30日

给你一个正整数?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

题解:

这是一道比较复杂的模拟题。问题关键在于找到不变的规则和改变的变量。

我们可以发现这是按照圈来转的,就是比如说,第一行先按顺序走一遍,然后最右边这一列,最下面这一行,第一列。

如此顺序的话,就决定了一定要有四个循环,那么如何处理这四个循环。

每次循环,我们可以采取左开右闭或者左闭右开(一个循环只处理左端点不处理右端点,或者是只处理右端点不处理左端点),每个循环都应该是一样的规则,我们这里选取左闭右开的原则。

需要注意的是,每一圈处理之后,要改变下一次的每一行或每一列长度,所以还需要加一个变量,控制偏移量。

这样我们在最外面只需要一个while控制圈数就可以了。

对于中间那个结点,奇数需要额外处理,偶数不需要,所以在最后判断一下,如是奇数,就把那个位置单独赋值。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int i,j,startx = 0,starty = 0,count = 1,offset = 1,loop = n/2,mid = n/2;
        vector<vector<int>> res(n,vector<int>(n,0));
        while(loop--){
            i = startx;
            j = starty;
            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){
            res[mid][mid] = count;
        }
        return res;
    }
};

文章来源:https://blog.csdn.net/L6666688888/article/details/135310919
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。