螺旋矩阵(spiral-matrix)解题思路分析与总结
Author:zhoulujun Date:
螺旋矩阵 不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。
54. 螺旋矩阵 https://leetcode.cn/problems/spiral-matrix/description/
59. 螺旋矩阵 II https://leetcode.cn/problems/spiral-matrix-ii/description/
885. 螺旋矩阵 III https://leetcode.cn/problems/spiral-matrix-iii/description/
已59为例,有非常多解法。
解法1
先跑圈缩圈,跑完后处理剩余的单行/列
function generateMatrix(n) { const matrix = new Array(n).fill(null).map(() => new Array(n).fill(null)); let num = 1; let left = 0, right = n - 1, top = 0, bottom = n - 1; while (left < right && top < bottom) {//不能越界 for (let i = left; i < right; i++) { matrix[top][i] = num; num++; } for (let i = top; i < bottom; i++) { matrix[i][right] = num; num++; } for (let i = right; i > left; i--) { matrix[bottom][i] = num; num++; } for (let i = bottom; i > top; i--) { matrix[i][left] = num; num++; } left++;top++; right--; bottom--;// 跑完缩圈 } if (top === bottom) {// 剩余的行列 for (let i = left; i <= right; i++) { matrix[top][i] = num; num++; } }else if (left === right) { for (let i = top; i <= bottom; i++) { matrix[i][left] = num; num++; } } return matrix; }
口诀表:
https://www.bilibili.com/video/BV1jK411H7XJ/
解法二
leetcode官方题解,个人觉得没有上面的简洁。
var generateMatrix = function(n) { let num = 1; const matrix = new Array(n).fill(0).map(() => new Array(n).fill(0)); let left = 0, right = n - 1, top = 0, bottom = n - 1; while (left <= right && top <= bottom) { for (let column = left; column <= right; column++) { matrix[top][column] = num; num++; } for (let row = top + 1; row <= bottom; row++) { matrix[row][right] = num; num++; } if (left < right && top < bottom) { for (let column = right - 1; column > left; column--) { matrix[bottom][column] = num; num++; } for (let row = bottom; row > top; row--) { matrix[row][left] = num; num++; } } left++;top++; right--; bottom--;// 跑完缩圈 } return matrix; };
解题三
直接看要跑多少圈,从最外圈开始跑,然后填数,直至跑完。
var generateMatrix = function(n) { let startX = 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; };
这个写法,我觉得更加复杂。
转载本站文章《螺旋矩阵(spiral-matrix)解题思路分析与总结》,
请注明出处:https://www.zhoulujun.cn/html/theory/algorithm/leetcode/9144.html