力扣第五十九题-螺旋矩阵 II

133 阅读2分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

前言

力扣第五十九题 螺旋矩阵 II 如下所示:

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

示例 1:

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

示例 2:

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

一、思路

螺旋矩阵 II力扣第五十四题-螺旋矩阵 是非常像的,实现的思路都很类似,有兴趣的也可以看一下那一题。

题目中共告诉了我们两个重要的信息:

  • 矩阵大小为 n x n
  • 填充矩阵的顺序为 ,起始值为 1 结束值为 n x n

既然我们都已经知道了矩阵的大小和它填充的顺序,那么我们就可以模拟这一过程。大致的步骤如下所示:

  1. 初始化一个 n x n 的空矩阵
  2. 从外圈向内圈填充(长度为 n 的矩阵共有 (n+1)/2 个圈)
  3. 填充的顺序为

圈的定义

圈是一个抽象的概念(便于理解),实际上对于奇数长度的矩阵,它的最内圈只有一个元素,但我们依然称之为一个圈。主要是为了指明在填充过程中需要对圈中的元素进行 的填充。

圈的个数就是指从外向内有多少个圈,如下图 5 x 5 的矩阵共有 3 个圈

image.png

举个例子

此处以填充 5 x 5 矩阵的第一个圈(最外圈)作为例子

  1. 从左向右处理第 1 个圈的元素,即填充 [0][0~4]

image.png

  1. 从上向下处理第 1 个圈的元素,即填充 [4][1~4]

image.png

  1. 从右向左处理第 1 个圈的元素,即填充 [4][3~0]

image.png

  1. 从下向上处理第 1 个圈的元素,即填充 [3~1][0]

image.png

二、实现

实现代码

实现代码与思路中保持一致,如下所示:

    public int[][] generateMatrix(int n) {
        int[][] ret = new int[n][n]; // 结果集
        int i = 0;
        // 共有多少个圈(如果为奇数会多一圈)
        int count = (n + 1) / 2;
        int currentVal = 1;
        // 从外部向内逐层遍历
        while(i < count) {
            // 向左
            for (int j = i; j < n-i; j++) {
                ret[i][j] = currentVal;
                currentVal++;
            }
            // 向下
            for (int j = i+1; j < n-i; j++) {
                ret[j][(n-1)-i] = currentVal;
                currentVal++;
            }
            // 向左
            for (int j = (n-1)-(i+1); j >= i && (n-1-i != i); j--) {
                ret[(n-1)-i][j] = currentVal;
                currentVal++;
            }
            // 向上
            for (int j = (n-1)-(i+1); j >= i+1 && (n-1-i) != i; j--) {
                ret[j][i] = currentVal;
                currentVal++;
            }
            i++;
        }
        return ret;
    }

测试代码

    public static void main(String[] args) {
        new Number59().generateMatrix(5);
    }

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥