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
我的题解(二维数组遍历)
此前做过一道螺旋数组遍历的题目,可做参考:
本题的思路和上面基本一致,就是把遍历时的取值操作变为了赋值操作罢了。具体的讲解可到上述博客中查看,这里就不赘述了。
/**
* @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
【更新结束】
有关参考
更新:2021年11月13日15:12:29
参考:【算法-LeetCode】54. 螺旋矩阵(二维数组)_赖念安的博客-CSDN博客
参考:在程序开发中,++i 与 i++的区别在哪里? - 知乎