【算法-LeetCode】59. 螺旋矩阵 II(二维数组)

59. 螺旋矩阵 II - 力扣(LeetCode)

文章起笔:2021年11月13日15:01:40

问题描述及示例

给你一个正整数 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

我的题解(二维数组遍历)

此前做过一道螺旋数组遍历的题目,可做参考:

参考:【算法-LeetCode】54. 螺旋矩阵(二维数组)_赖念安的博客-CSDN博客

本题的思路和上面基本一致,就是把遍历时的取值操作变为了赋值操作罢了。具体的讲解可到上述博客中查看,这里就不赘述了。

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
  // count作为一个全局变量记录往当前遍历元素所赋的值,注意它的初始值为1,因为下面的遍历
  // 中,我用的是count++来更新计数器,如果下面使用的是++count,则此处应当初始化为0
  // 有关count++和++count的区别,可以参看下方【有关参考】中的相关链接
  let count = 1;
  // 创建一个指定长宽的二维矩阵,该矩阵将作为最终的返回值返回
  let matrix = Array.from({length: n}). map(
    () => Array.from({length: n}).fill(0)
  );
  // 后续的操作和之前那道题就基本一致了
  let wrapperNum = Math.ceil(n / 2);
  for (let i = 0; i < wrapperNum; i++) {
    traverseWrapper(matrix, [i, n - 1 - i, i, n - 1 - i]);
  }
  return matrix;

  // traverseWrapper用于遍历arr数组的某一圈,遍历范围由range指定
  // 这里的逻辑和之前的那道题一样,只不过把取值操作变为了赋值操作,
  // 而且注意下面我更新计数器的值时,用的是count++
  function traverseWrapper(arr, range) {
    for (let i = range[0]; i <= range[1] - 1; i++) {
      arr[range[2]][i] = count++;
    }
    for (let i = range[2]; i <= range[3]; i++) {
      arr[i][range[1]] = count++;
    }
    for (let i = range[1] - 1; i >= range[0] + 1; i--) {
      if (range[2] === range[3]) {
        break;
      }
      arr[range[3]][i] = count++;
    }
    for (let i = range[3]; i >= range[2] + 1; i--) {
      if (range[0] === range[1]) {
        break;
      }
      arr[i][range[0]] = count++;
    }
  }
};


提交记录
执行结果:通过
20 / 20 个通过测试用例
执行用时:64 ms, 在所有 JavaScript 提交中击败了90.53%的用户
内存消耗:37.7 MB, 在所有 JavaScript 提交中击败了89.13%的用户
时间:2021/11/13 15:05

官方题解

更新:2021年7月29日18:43:21

因为我考虑到著作权归属问题,所以【官方题解】部分我不再粘贴具体的代码了,可到下方的链接中查看。

【更新结束】

更新:2021年11月13日15:06:32

参考:螺旋矩阵 II - 螺旋矩阵 II - 力扣(LeetCode)

【更新结束】

有关参考

更新:2021年11月13日15:12:29
参考:【算法-LeetCode】54. 螺旋矩阵(二维数组)_赖念安的博客-CSDN博客
参考:在程序开发中,++i 与 i++的区别在哪里? - 知乎

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值