【LeeCode】59.螺旋矩阵II

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

解:

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] arr = new int[n][n]; // 创建 n * n 数组
​
        int topRow = 0, bottomRow = n - 1; // 定义上边界和下边界
        int leftCol = 0, rightCol = n - 1; // 定义左边界和右边界
        int direction = 0; // 初始方向,0代表向右
​
        int num = 1; // 要赋的值
​
        while (topRow <= bottomRow && leftCol <= rightCol) {
            if (direction == 0) { // 向右
                for (int i = leftCol; i <= rightCol; i++) {
                    arr[topRow][i] = num++;
                }
                topRow++; // 上边界下移
            } else if (direction == 1) { // 向下
                for (int i = topRow; i <= bottomRow; i++) {
                    arr[i][rightCol] = num++;
                }
                rightCol--; // 右边界左移
            } else if (direction == 2) { // 向左
                for (int i = rightCol; i >= leftCol; i--) {
                    arr[bottomRow][i] = num++;
                }
                bottomRow--; // 下边界上移
            } else if (direction == 3) { // 向上
                for (int i = bottomRow; i >= topRow; i--) {
                    arr[i][leftCol] = num++;
                }
                leftCol++; // 左边界右移
            }
            direction = (direction + 1) % 4; // 切换方向
        }
        return arr;
    }
}

另解:

class Solution {
    public int[][] generateMatrix(int n) {
        int loop = 0;  // 控制循环次数
        int[][] res = new int[n][n];
        int start = 0;  // 每次循环的开始点(start, start)
        int count = 1;  // 定义填充数字
        int i, j;
​
        while (loop++ < n / 2) { // 判断边界后,loop从1开始
            // 模拟上侧从左到右
            for (j = start; j < n - loop; j++) {
                res[start][j] = count++;
            }
​
            // 模拟右侧从上到下
            for (i = start; i < n - loop; i++) {
                res[i][j] = count++;
            }
​
            // 模拟下侧从右到左
            for (; j >= loop; j--) {
                res[i][j] = count++;
            }
​
            // 模拟左侧从下到上
            for (; i >= loop; i--) {
                res[i][j] = count++;
            }
            start++;
        }
​
        if (n % 2 == 1) {
            res[start][start] = count;
        }
​
        return res;
    }
}

你可能感兴趣的:(#,LeeCode,算法,java,leetcode)