需要模拟的题目没有啥算法技巧,只能模拟其变化的轨迹,得到答案
54.螺旋矩阵
按照「形状」进行模拟

/*** 按形状模拟* @param {number[][]} matrix* @return {number[]}*/var spiralOrder = function (matrix) {let ans = new Array();let m = matrix.length, n = matrix[0].length;circle(matrix, 0, 0, m - 1, n - 1);return ans;function circle(matrix, x1, y1, x2, y2) {if (x2 < x1 || y2 < y1) return;// 只有一行时,按「行」遍历if (x1 === x2) {for (let i = y1; i <= y2; i++) {ans.push(matrix[x1][i]);}return;}// 只有一列时,按「列」遍历if (y1 === y2) {for (let i = x1; i <= x2; i++) {ans.push(matrix[i][y2]);}return;}// 圈for (let i = y1; i < y2; i++)ans.push(matrix[x1][i]);for (let i = x1; i < x2; i++)ans.push(matrix[i][y2]);for (let i = y2; i > y1; i--)ans.push(matrix[x2][i]);for (let i = x2; i > x1; i--)ans.push(matrix[i][y1]);// 往里收一圈,继续遍历circle(matrix, x1 + 1, y1 + 1, x2 - 1, y2 - 1);}};
按照「方向」进行模拟

/*** 按方向模拟* @param {number[][]} matrix* @return {number[]}*/const direction = [[0, 1], [1, 0], [0, -1], [-1, 0]];var spiralOrder = function (matrix) {let ans = new Array();let m = matrix.length, n = matrix[0].length;for (let x = 0, y = 0, d = 0, i = 0; i < n * m; i++) {ans.push(matrix[x][y]);matrix[x][y] = Infinity;let nx = x + direction[d][0];let ny = y + direction[d][1];if (nx < 0 || nx >= m || ny < 0 || ny >= n || matrix[nx][ny] === Infinity) {d = (d + 1) % 4;nx = x + direction[d][0];ny = y + direction[d][1];}x = nx;y = ny;}return ans;};
