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

相关推荐
米饭不加菜26 分钟前
Typora 原生流程图语法完全指南(Flowchart.js)
前端·javascript·流程图
scan72431 分钟前
langgraphy条件边
前端·javascript·html
故事和你911 小时前
洛谷-【动态规划1】动态规划的引入2
开发语言·数据结构·c++·算法·动态规划·图论
重生之我是Java开发战士1 小时前
【动态规划】背包问题:完全背包,二位费用的背包问题,似包非包
算法·动态规划
冰小忆1 小时前
类变量在继承场景下的初始化规则是怎样的?
java·前端·数据库
用户938515635071 小时前
《JS 对象知识地图:10 个小节,从字面量到原型链全覆盖》
javascript
YAwu111 小时前
JavaScript this 底层机制剖析
前端·javascript
tedcloud1231 小时前
wifi-densepose部署教程:构建无线人体感知系统
服务器·javascript·网络·typescript·ocr
用户852495071841 小时前
帮你搞清楚对付js里对象的小妙招^_^
javascript
LabVIEW开发1 小时前
LabVIEW实现FDTD 电磁仿真
算法·labview·labview知识·labview功能·labview程序