59. 螺旋矩阵 II

题意:

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]

class Solution {
public:
    vector> generateMatrix(int n) {
        
    }
};

思路:

模拟题
构建两个方向数组,一个表示列方向,一个表示行方向,每次当前坐标(x, y)加上当前方向坐标得到新的坐标(new_x, new_y), new_x = x + dirx, new_y = y + diry,然后判断新坐标是否越界或者会覆盖之前写过的值, 如果会,就要回退,并且发生方向变动,当方向数组发生越界,回退为从0开始即可。

代码:

class Solution {
public:
    vector> generateMatrix(int n) {
        // 初始化数组
        vector > ans(n, vector(n));
        
        int dirx[4] = {0, 1, 0, -1}; // 行 方向
        int diry[4] = {1, 0, -1, 0}; // 列 方向
        int nowx = 0; // 行方向下标
        int nowy = 0; // 列方向下标
        int x = 0;
        int y = 0;
        for(int i=1; i<=n*n; i++){
            ans[x][y] = i;
           
            y += diry[nowy];
            x += dirx[nowx];
            
            if (y >= n || y < 0 || x >= n || x < 0 || ans[x][y] != 0){
                y -= diry[nowy];
                x -= dirx[nowx];
                nowy ++;
                nowx ++;
                if(nowy >= 4) nowy = 0;
                if(nowx >= 4) nowx = 0;
                y += diry[nowy];
                x += dirx[nowx];
            }
            
        }
        return ans;
    }
};

方向数组是一个二维平面移动处理很常用的技巧哦~

你可能感兴趣的:(59. 螺旋矩阵 II)