题目

力扣题目链接

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

示例 1:
image.png

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

示例 2:

输入:n = 1
输出:[[1]]

提示:

  • 1 <= n <= 20

思路

类似于这种螺旋矩阵的问题,我们可以生成一个 n×n 空矩阵 matrix,随后模拟整个向内环绕的填入过程。

先设定上下左右四个边界赋予初值。然后按照 从左到右 从上到下 从右到左 从下到上 填入顺序循环,每次填入后更新上下左右四个边界的值即可。

答案

Java

class Solution {
    public int[][] generateMatrix(int n) {
        // 申请一个 n x n 大小的正方形矩阵
        int[][] matrix = new int[n][n];

        // 规定上下左右四边界
        int top = 0, bottom = n - 1, left = 0, right = n - 1;

        // 从 1 开始填, 到 count 为止
        int num = 1, count = n * n;

        // 循环向矩阵 matrix 内填入 num
        while (num <= count) {
            // 从左界到右界(从矩阵左上角填到右上角)
            for (int i = left; i <= right; i++) {
                matrix[top][i] = num++;
            }
            // 上界向下收缩1格, 因为矩阵的上侧已经填写完成
            top++;

            // 从上界到下界(从矩阵右上角填到右下角)
            for (int i = top; i <= bottom; i++) {
                matrix[i][right] = num++;
            }
            // 右界向左移动1格, 因为矩阵的右侧已经填写完成
            right--;

            // 从右界到左界(从矩阵右下角填到左下角)
            for (int i = right; i >= left; i--) {
                matrix[bottom][i] = num++;
            }
            // 下界向上移动1格, 因为矩阵的下侧已经填写完成
            bottom--;

            // 从下界到上界(从矩阵左下角填到左上角)
            for (int i = bottom; i >= top; i--) {
                matrix[i][left] = num++;
            }
            // 左界向右移动1格, 因为矩阵的左侧已经填写完成
            left++;

        }

        return matrix;
    }
}

REF

https://leetcode-cn.com/problems/spiral-matrix-ii/
https://leetcode-cn.com/problems/spiral-matrix-ii/solution/spiral-matrix-ii-mo-ni-fa-she-ding-bian-jie-qing-x/