LeetCode-59. 螺旋矩阵 II

题目来源

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

题解分析

  1. LeetCode上有几道题目是与本题相似题型的,可以参考:54. 螺旋矩阵 + 蛇形矩阵打印 + 螺旋矩阵剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题
  2. 看完本题的题目后,我们可以知道的是,螺旋矩阵在某个时刻会转变遍历的方向,而且方向只有四种。
  3. 那螺旋矩阵什么时候才会转换遍历方向呢?这是解决本题的核心,也是决定着能够顺利求解本题。
    • 值得注意的是,每当在一个方向遍历时,如果遇到了越界了的情况,那就说明了需要进行转换方向了。
    • 此外,我们仔细观察一下8和1这两个数字,当遍历到8时,其实还没遇到边界,方向还是改变了。那是什么原因导致方向改变呢?答案就是遇到重复遍历的格子!我们在这里可以设置一个isTravel的布尔矩阵来标识某个坐标是否已经遍历了。
  4. 综上,我们就可以写出本题的代码了,具体的实现还是很简单的。
class Solution {
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        int tot = n * n;
        boolean[][] isTravel = new boolean[n][n];
        int di = 0, dj = 0;
        res[0][0] = 1; 
        isTravel[0][0] = true;
        int curdir = 0;
        for(int i=1; i<tot; i++){
            int x = di + dir[curdir][0];
            int y = dj + dir[curdir][1];
            if(x < 0 || y < 0 || x >= n || y >= n || isTravel[x][y]){
                curdir = (curdir + 1) % 4;
            }
            di = di + dir[curdir][0];
            dj = dj + dir[curdir][1];
            isTravel[di][dj] = true;
            res[di][dj] = i + 1;
        }
        return res;
    }
}

结果展示

image

posted @ 2022-02-05 20:39  Garrett_Wale  阅读(41)  评论(0编辑  收藏  举报