文章起笔: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++的区别在哪里? - 知乎