跟着代码随想录 四 螺旋矩阵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循环的内容有点绕,为了防止不被绕晕过去,一定要遵循不变量原则,从右,上,左,上遍历都是左闭右开。也就是第一行最后一个元素第一个循环不遍历,因为是往下的开始,所以左闭右开。然后就可以尽情的开始模拟了,每次调整起始位置,然后就最中间的那个元素也填充进去就完成了。

相关推荐
ytttr87343 分钟前
隐马尔可夫模型(HMM)MATLAB实现范例
开发语言·算法·matlab
小二·1 小时前
前端监控体系完全指南:从错误捕获到用户行为分析(Vue 3 + Sentry + Web Vitals)
前端·vue.js·sentry
点云SLAM2 小时前
凸优化(Convex Optimization)理论(1)
人工智能·算法·slam·数学原理·凸优化·数值优化理论·机器人应用
阿珊和她的猫2 小时前
IIFE:JavaScript 中的立即调用函数表达式
开发语言·javascript·状态模式
jz_ddk2 小时前
[学习] 卫星导航的码相位与载波相位计算
学习·算法·gps·gnss·北斗
阿珊和她的猫2 小时前
`require` 与 `import` 的区别剖析
前端·webpack
放荡不羁的野指针2 小时前
leetcode150题-动态规划
算法·动态规划
sin_hielo2 小时前
leetcode 1161(BFS)
数据结构·算法·leetcode
一起努力啊~2 小时前
算法刷题-二分查找
java·数据结构·算法
智商偏低2 小时前
JSEncrypt
javascript