需要模拟的题目没有啥算法技巧,只能模拟其变化的轨迹,得到答案

54.螺旋矩阵

QQ截图20210627140257.png

按照「形状」进行模拟

圈.png

  1. /**
  2. * 按形状模拟
  3. * @param {number[][]} matrix
  4. * @return {number[]}
  5. */
  6. var spiralOrder = function (matrix) {
  7. let ans = new Array();
  8. let m = matrix.length, n = matrix[0].length;
  9. circle(matrix, 0, 0, m - 1, n - 1);
  10. return ans;
  11. function circle(matrix, x1, y1, x2, y2) {
  12. if (x2 < x1 || y2 < y1) return;
  13. // 只有一行时,按「行」遍历
  14. if (x1 === x2) {
  15. for (let i = y1; i <= y2; i++) {
  16. ans.push(matrix[x1][i]);
  17. }
  18. return;
  19. }
  20. // 只有一列时,按「列」遍历
  21. if (y1 === y2) {
  22. for (let i = x1; i <= x2; i++) {
  23. ans.push(matrix[i][y2]);
  24. }
  25. return;
  26. }
  27. // 圈
  28. for (let i = y1; i < y2; i++)
  29. ans.push(matrix[x1][i]);
  30. for (let i = x1; i < x2; i++)
  31. ans.push(matrix[i][y2]);
  32. for (let i = y2; i > y1; i--)
  33. ans.push(matrix[x2][i]);
  34. for (let i = x2; i > x1; i--)
  35. ans.push(matrix[i][y1]);
  36. // 往里收一圈,继续遍历
  37. circle(matrix, x1 + 1, y1 + 1, x2 - 1, y2 - 1);
  38. }
  39. };

按照「方向」进行模拟

形状.png

  1. /**
  2. * 按方向模拟
  3. * @param {number[][]} matrix
  4. * @return {number[]}
  5. */
  6. const direction = [
  7. [0, 1], [1, 0], [0, -1], [-1, 0]
  8. ];
  9. var spiralOrder = function (matrix) {
  10. let ans = new Array();
  11. let m = matrix.length, n = matrix[0].length;
  12. for (let x = 0, y = 0, d = 0, i = 0; i < n * m; i++) {
  13. ans.push(matrix[x][y]);
  14. matrix[x][y] = Infinity;
  15. let nx = x + direction[d][0];
  16. let ny = y + direction[d][1];
  17. if (nx < 0 || nx >= m || ny < 0 || ny >= n || matrix[nx][ny] === Infinity) {
  18. d = (d + 1) % 4;
  19. nx = x + direction[d][0];
  20. ny = y + direction[d][1];
  21. }
  22. x = nx;
  23. y = ny;
  24. }
  25. return ans;
  26. };