leetcode---59.螺旋矩阵 II

leetcode—59.螺旋矩阵 II

关键字:二维数组 循环设计

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

示例 1:
在这里插入图片描述

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

提示:
1 <= n <= 20

https://leetcode-cn.com/problems/spiral-matrix-ii/


解法

这道题遇到了一个问题是JavaScript生成矩阵的一个方法,

const matrixH = Array.from({length: n}).map(()=>new Array(n));

Array.from() 用于生成一个数组
map()方法将数组中的元素通过箭头函数进行一个映射。
详细见 箭头函数
Array.map()

map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数。callback 每次执行后的返回值(包括undefined)组合起来形成一个新数组。 callback 函数只会在有值的索引上被调用;那些从来没被赋过值或者使用 delete删除的索引则不会被调用。

const materials = [
  'Hydrogen',
  'Helium',
  'Lithium',
  'Beryllium'
];
// 这里aa表示参数名
console.log(materials.map(aa => aa.length));
// expected output: Array [8, 6, 7, 9]

思路

这道题的循环思路是要确定好循环过程中每个边的范围,
在这里插入图片描述
如上图所示,每条边走两格(即n-1格),走四次刚好遍历了周围一圈的边界。

同时针对n的奇偶性,判断出需要进行的循环层数( 即n地板除2 )

let loop = 0;
while (loop<(n>>1)){
	...
}

例,n等于3时,只循环一层;n等于4时,循环两层

对于n为奇数时,需要在循环结束后,对中心的一个格子进行补充赋值

// n为奇数时,需要补充最中间区域的值
if (n & 1) {
	matrixH[i][j] = countnum;
}

随着循环,每一层对应边的长度会发生变化,随层数增加而减少

for (j; j<n-loop-1; j++) {
	...
}

并且走过一层后,坐标点i,j会回到这一层循环的出发点,为了进入下一层循环,每层结束后要进行更新。

loop++;
i++;
j++;

比如n为4时,分为两层,第一层结束坐标为(0, 0); 第二层开始坐标为(1, 1)。

代码

var generateMatrix = function(n) {
    // 生成指定大小的矩阵
    const matrixH = Array.from({length: n}).map(()=>new Array(n));
    let loop = 0,
        i = 0, j = 0,
        countnum = 1;
    // 循环次数由n//2决定
    while (loop<(n>>1)) {
        // 上面一条边
        for (j; j<n-loop-1; j++) {
            matrixH[i][j] = countnum;
            countnum++;
        }
        // 右面一条边
        for (i; i<n-loop-1; i++) {
            matrixH[i][j] = countnum;
            countnum++;
        }
        // 下面一条边
        for (j; j>loop; j--) {
            matrixH[i][j] = countnum;
            countnum++;
        }
        // 左面一条边
        for (i; i>loop; i--) {
            matrixH[i][j] = countnum;
            countnum++;
        }
        // 更新进入内层的下一次循环
        loop++;
        i++;
        j++;

    }
    // n为奇数时,需要补充最中间区域的值
    if (n & 1) {
        matrixH[i][j] = countnum;
    }
    return matrixH;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值