Leetcode 59.螺旋矩阵Ⅱ

1.题目

image-20240310213332946

2.思路

image-20240310213621445
(借用代码随想录的图)
1.我们将转一圈看作一个循环(1->2->3->4->5->6->7->8 这是一个循环)
2.在这个循环里,我们要画四条边(上右下左)
填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上
3.因为画这四条边,有重复元素,我们为了统一处理拐角处元素的规则,规定拐角处都让给新的一条边,就是上图不同颜色的边
4. 这样就有两个循环了(第一个循环表示要绘制多少个四条边,第二个循环里绘制四条边)

3.实施细节

1.在画每一条边的时候,我们首先考虑到的第一个问题是:怎么把数写到对应位置去?
解决:设置一个遍历参数,表示当前的位置
ori_i (表示当前位置的横坐标), ori_j(表示当前位置的列坐标)
res[ori_i][ori_j]= num;

2.接下来会遇到:什么时候该画下一条边?
解决:设置边界参数,按3*3矩阵举例
col_max=2(列最大边界)col_min=0(列最小边界)
row_max=2(行最大边界) row_min=0
拿上行从左到右举例:当遍历参数ori_j <= col_max 时画这条边
其他三条边类推

3 画完这四条边后,就该进入到下一个循环了,该继续画下一个四条边了。这时候我们要设置开始绘制的起点。通过一个start参数来设置每次循环的起点

4 要注意当n=奇数的时候,最后最中间会只留下一个小块,这个时候我们规定这四条边都不绘制中间的小块,我们跳出循环,单独给这个小块赋值!

5 怎样判断绘制结束?
解决:当row_min>= row_max 时结束!
注意这里是大于等于 因为当row_min=row_max的时候表示只剩下中间一个小块了,而根据4.的规定,中间小块我们要跳出循环来单独赋值

4.Java代码实现


class Solution {
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        int start = 0; //定义初始点
        //定义边界
        int row_max = n - 1;
        int col_max = n - 1;
        int row_min = 0;
        int col_min = 0;

        int num = 1; //定义要写的数
        while (row_max > row_min) {

            int ori_i = start;
            int ori_j = start;
            //上侧从左到右
            for (; ori_j <= col_max - 1; ori_j++) {
                res[ori_i][ori_j] = num;
                num++;
            }
            //右侧从上到下
            for (; ori_i <= row_max - 1; ori_i++) {
                res[ori_i][ori_j] = num;
                num++;
            }
            //下侧从右往左
            for (; ori_j >= col_min + 1; ori_j--) {
                res[ori_i][ori_j] = num;
                num++;
            }
            //左侧从下往上
            for (; ori_i >= row_min + 1; ori_i--) {
                res[ori_i][ori_j] = num;
                num++;
            }
            //更新边界
            row_max--;
            col_max--;
            row_min++;
            col_min++;
            //更新初始点
            start++;
        }
        //如果是奇数,需要给最中间的单独赋值
        if (n % 2 == 1) {
            res[start][start] = num;
        }
        return res;
    }
}

相关推荐

  1. Golang leetcode59 螺旋矩阵

    2024-03-11 09:06:01       51 阅读
  2. LeetCode59 螺旋矩阵 II

    2024-03-11 09:06:01       51 阅读
  3. leetCode59. 螺旋矩阵 II

    2024-03-11 09:06:01       36 阅读
  4. Leetcode 59. 螺旋打印矩阵

    2024-03-11 09:06:01       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 09:06:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 09:06:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 09:06:01       82 阅读
  4. Python语言-面向对象

    2024-03-11 09:06:01       91 阅读

热门阅读

  1. 国外客户代采1688商品如何实现自动化对接

    2024-03-11 09:06:01       71 阅读
  2. orm之SQLAlchemy

    2024-03-11 09:06:01       39 阅读
  3. docker安装redis7

    2024-03-11 09:06:01       47 阅读
  4. 探秘HTTPS:如何通过SSL/TLS保证网络通信安全

    2024-03-11 09:06:01       39 阅读
  5. 装饰器模式

    2024-03-11 09:06:01       43 阅读
  6. 【设计模式专题之抽象工厂模式】3. 家具工厂

    2024-03-11 09:06:01       36 阅读
  7. matlab学习笔记

    2024-03-11 09:06:01       45 阅读