跟着代码随想录 四 螺旋矩阵II 数组完结

leetcode 螺旋矩阵II 特别容易绕晕的模拟(理解了好久,真的好容易晕)

哈喽哈喽,我是你们的金樽清酒。这已经是跟着代码随想的第四期了,虽然我一直在看,但是写的文章比较少,也是终于迎来了数组的终章。

往期回顾

往期数组我们学过什么知识呢?

  • 二分查找
  • 移除元素
  • 滑动窗口 其实这些都涉及到了双指针,所以学习数组一定要掌握好双指针的应用。

but,今天我们不涉及啥复杂的算法,甚至就是模拟,那你可能会觉得,那不就很简单?其实不然,今天的螺旋矩阵是特别容易绕晕的。我们要遵循一个原则,循环不变量。什么叫做循环不变量,举个例子,像高中的分段函数一样,约定好左闭右开的区间就贯彻到底,全球统一,不统一不能说你错了,而是不够规范,容易出错。这个不变的规则就是不变量。

先看题目

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

示例 1:

ini 复制代码
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]

示例 2:

lua 复制代码
输入: n = 1
输出: [[1]]

分析一下,给我们一个n,说明是n*n的矩阵,这个矩阵要是螺旋矩阵,不理解螺旋矩阵的可以去尝试一下遍历螺旋数组。简单的来说就是一直按照右,下,左,上去遍历,遍历完外层,遍历内层,现在我们就是要打造一个螺旋矩阵。那么我们也要按照螺旋矩阵的规则去完善矩阵的值。

代码

js 复制代码
var generateMatrix = function (n) {
    let startX = 0
    let startY = 0;   // 起始位置
    let loop = Math.floor(n / 2);   // 旋转圈数
    let mid = Math.floor(n / 2);    // 中间位置
    let offset = 1;    // 控制每一层填充元素个数
    let count = 1;     // 更新填充数字
    let res = new Array(n).fill(0).map(() => new Array(n).fill(0));

    while (loop--) {
        let row = startX, col = startY;
        // 上行从左到右(左闭右开)
        for (; col < n - offset; col++) {
            res[row][col] = count++;
        }
        // 右列从上到下(左闭右开)
        for (; row < n - offset; row++) {
            res[row][col] = count++;
        }
        // 下行从右到左(左闭右开)
        for (; col > startY; col--) {
            res[row][col] = count++;
        }
        // 左列做下到上(左闭右开)
        for (; row > startX; row--) {
            res[row][col] = count++;
        }

        // 更新起始位置
        startX++;
        startY++;

        // 更新offset
        offset += 1;
    }
    // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
    if (n % 2 === 1) {
        res[mid][mid] = count;
    }
    return res;
};

其实大体的思路并不是很难,就是代码量有点大,和for循环的内容有点绕,为了防止不被绕晕过去,一定要遵循不变量原则,从右,上,左,上遍历都是左闭右开。也就是第一行最后一个元素第一个循环不遍历,因为是往下的开始,所以左闭右开。然后就可以尽情的开始模拟了,每次调整起始位置,然后就最中间的那个元素也填充进去就完成了。

相关推荐
麦兜*39 分钟前
Spring Boot 集成Reactive Web 性能优化全栈技术方案,包含底层原理、压测方法论、参数调优
java·前端·spring boot·spring·spring cloud·性能优化·maven
Jinkxs40 分钟前
JavaScript性能优化实战技术
开发语言·javascript·性能优化
thusloop41 分钟前
380. O(1) 时间插入、删除和获取随机元素
数据结构·算法·leetcode
知了一笑1 小时前
独立开发第二周:构建、执行、规划
java·前端·后端
MobotStone1 小时前
无代码+AI时代,为什么你仍然需要像个开发者一样思考
人工智能·算法
緈福的街口1 小时前
【leetcode】584. 寻找用户推荐人
算法·leetcode·职场和发展
UI前端开发工作室1 小时前
数字孪生技术为UI前端提供新视角:产品性能的实时模拟与预测
大数据·前端
Sapphire~1 小时前
重学前端004 --- html 表单
前端·html
今天背单词了吗9802 小时前
算法学习笔记:17.蒙特卡洛算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·笔记·考研·算法·蒙特卡洛算法
Maybyy2 小时前
力扣242.有效的字母异位词
java·javascript·leetcode