【力扣】螺旋矩阵

59. 螺旋矩阵 II

刚开始遇到这道题目的时候相信没见过的同学多多少少都会有点懵圈,感觉题目有点无从下手,但其实只要抓住本质就行了,题目的最终目的就是返回一个二维数组的结果,这个二维数组的大小是的 int[n][n],题目给出了 n = 3 时的输出结果:

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

那其实我们要做的就是将矩阵中的每一个单元格的内容填充进这个二维数组中,至于填充的过程是怎样的,就需要我们去找出规律,然后用代码去模拟这个旋转过程了,可见这是一道过程模拟的编程题。

以 n == 4,有规律如下:

不难发现,n = 4 的情况下,旋转了两圈。n = 3 的情况下,旋转了一圈,外加一个中心坐标。于是模拟顺时针矩阵的过程可以这样:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

由外向内一圈一圈这么画下去。

这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。

那么我按照左闭右开的原则,来画一圈,大家看一下:

Java 代码如下:

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] result = new int[n][n];
        int loop = n / 2;       // 螺旋圈数
        int mid = n / 2;        // 中心坐标,eg:n==3的中心坐标是[1,1]
        int num = 1;            // 螺旋排序从1开始
        int startx = 0;         // 起点x坐标
        int starty = 0;         // 起点y坐标
        int offset = 1;         // 偏移量
        int i, j;               // 作为每次循环的起始坐标
        while(loop-- > 0) {

            // 模拟填充上行过程(左闭右开)
            for(j = starty; j < n - offset; j++) {
                result[startx][j] = num++;
            }
            // 模拟填充右列过程(上闭下开)
            for(i = startx; i < n - offset; i++) {
                result[i][j] = num++;
            }
            // 模拟填充下行过程(右闭左开)
            for(; j > starty; j--) {
                result[i][j] = num++;
            }
            // 模拟填充左列过程(下闭上开)
            for(; i > startx; i--) {
                result[i][j] = num++;
            }
            
            // 更新坐标
            startx++;
            starty++;
            // 更新偏移量
            offset += 1;
        }
        // 如果是奇数,中心坐标需要单独处理
        if(n % 2 == 1) {
            result[mid][mid] = num++;
        }
        return result;
    }
}

相关推荐

  1. 59-螺旋矩阵

    2024-04-25 06:12:04       42 阅读
  2. 54. 螺旋矩阵

    2024-04-25 06:12:04       42 阅读
  3. 100】54.螺旋矩阵

    2024-04-25 06:12:04       41 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-25 06:12:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-25 06:12:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-25 06:12:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-25 06:12:04       20 阅读

热门阅读

  1. 各种类型游戏的乐趣与魅力

    2024-04-25 06:12:04       12 阅读
  2. 架构师系列-Nginx、OpenResty(三)- 负载均衡配置

    2024-04-25 06:12:04       16 阅读
  3. MySQL的数据类型

    2024-04-25 06:12:04       17 阅读
  4. jenkins流水线学习(工具)

    2024-04-25 06:12:04       13 阅读
  5. 【大数据面试题】024 Spark 3 升级了些什么?

    2024-04-25 06:12:04       14 阅读