54. 螺旋矩阵
这个是一道模拟题,但我记得我大一第一次做这道题的时候真的就是纯按步骤模拟,没有对代码就行优化,导致代码写的很臃肿。
有这么几个地方可以改进。
- 看题目可以知道最终的结果一定是rows*cols个结点,所以只需要遍历rows*cols次
- 把遍历顺序用方向数组来控制走向
- 判断是否要顺时针旋转一次时,只需要 " !(符合条件情况)" 即可
具体实现细节可以看我代码里的注释
//模拟
var spiralOrder = function (matrix) {const rows = matrix.length, cols = matrix[0].length;if (!rows || !cols) return [];const books = new Array(rows).fill(0).map(() => new Array(cols).fill(0));//标记let sum = rows * cols;//总点数const ans = [];//结果数组//方向const direction = [[0, 1], [1, 0], [0, -1], [-1, 0]];let index = 0, row = 0, col = 0;while (sum--) {if (ans.length === rows * cols) break;ans.push(matrix[row][col]);books[row][col] = 1;//按照原方向走的下一步const newRow = row + direction[index][0];const newCol = col + direction[index][1];if (!(newRow < rows && newRow >= 0 && newCol >= 0 && newCol < cols && books[newRow][newCol] === 0)) {//判断是否要变成下一个方向(!包裹,所以括号里只需要写符合条件的条件就行)index = (index + 1) % 4;}//更新下一步坐标row += direction[index][0];col += direction[index][1];}return ans;
};