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

相关推荐
所待.3833 分钟前
小小扑克牌算法
java·算法
.生产的驴11 分钟前
SpringBoot 消息队列RabbitMQ 消息确认机制确保消息发送成功和失败 生产者确认
java·javascript·spring boot·后端·rabbitmq·负载均衡·java-rabbitmq
布瑞泽的童话25 分钟前
无需切换平台?TuneFree如何搜罗所有你爱的音乐
前端·vue.js·后端·开源
眰恦37432 分钟前
数据结构--第六章图
数据结构·算法
白鹭凡37 分钟前
react 甘特图之旅
前端·react.js·甘特图
2401_8628867841 分钟前
蓝禾,汤臣倍健,三七互娱,得物,顺丰,快手,游卡,oppo,康冠科技,途游游戏,埃科光电25秋招内推
前端·c++·python·算法·游戏
luthane43 分钟前
python 实现armstrong numbers阿姆斯壮数算法
python·算法
楠枬1 小时前
双指针算法
java·算法·leetcode
sjsjs111 小时前
【数据结构-差分】力扣1589. 所有排列中的最大和
数据结构·算法·leetcode