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

相关推荐
魔术师Grace2 分钟前
我给 AI 做了场入职培训
前端·程序员
Old Uncle Tom32 分钟前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆42 分钟前
洛谷题单入门1 顺序结构
数据结构·算法·golang
生信碱移44 分钟前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
玩嵌入式的菜鸡1 小时前
网页访问单片机设备---基于mqtt
前端·javascript·css
前端一小卒1 小时前
我用 Claude Code 的 Superpowers 技能链写了个服务,部署前差点把服务器搞炸
前端·javascript·后端
智者知已应修善业1 小时前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
滑雪的企鹅.2 小时前
HTML头部元信息避坑指南大纲
前端·html
一拳不是超人2 小时前
老婆天天吵吵要买塔罗牌,我直接用 AI 2 小时写了个在线塔罗牌
前端·ai编程
智者知已应修善业3 小时前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机