力扣59. 螺旋矩阵 II

文章目录

力扣59. 螺旋矩阵 II

示例

思路

本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力,容易出错!

而求解本题要坚持循环不变量原则 。就能很大程度避免错误

模拟顺时针画矩阵的过程:

填充上行从左到右

填充右列从上到下

填充下行从右到左

填充左列从下到上

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

可以发现这里的边界条件非常多,在一个循环中,如此多的边界条件,如果不按照固定规则来遍历,那就是一进循环深似海,从此offer是路人。

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

代码如下,已经详细注释了每一步的目的,可以看出while循环里判断的情况是很多的,代码里处理的原则也是统一的左闭右开

代码实现

bash 复制代码
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;
    }
}

总结收获

这道题依然要坚持循环不变量原则(二分法也是这样的!)

相关推荐
一粒沙白猫2 分钟前
Java综合练习04
java·开发语言·算法
爱coding的橙子42 分钟前
每日算法刷题Day41 6.28:leetcode前缀和2道题,用时1h20min(要加快)
算法·leetcode·职场和发展
一只鱼^_1 小时前
基础算法合集-图论
数据结构·算法·深度优先·图论·广度优先·宽度优先·图搜索算法
2301_803554521 小时前
c++中的绑定器
开发语言·c++·算法
人生在勤,不索何获-白大侠2 小时前
day15——Java常用API(二):常见算法、正则表达式与异常处理详解
java·算法·正则表达式
Wo3Shi4七2 小时前
双向队列
数据结构·算法·go
Wo3Shi4七2 小时前
列表
数据结构·算法·go
Wo3Shi4七2 小时前
链表
数据结构·算法·go
Wo3Shi4七3 小时前
数组
数据结构·算法·go