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;
};