59. 螺旋矩阵 II

题意:

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

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

思路:

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

代码:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        // 初始化数组
        vector<vector<int> > ans(n, vector<int>(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;
    }
};

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 成功的驱动力来自内在的驱动力和外在的驱动力。内在的驱动力就是要我们自己主导自己的人生,正如阳明先生教诲,立志、勤学...
    BonSun阅读 772评论 0 0
  • 7月的最后一天,小狮子计划终评入围名单惊喜满满当看到名单时,脑子里瞬间都是互加学习的画面,回顾这一年以来,...
    宣威064李季梅阅读 146评论 0 0