上机系列: 顺时针螺旋顺序遍历矩阵

113 阅读1分钟

给你一个 m 行 n 列的知阵 matrix , 请按照 顺时针螺旋顺序,返回知阵中的所有元素 image.png

首先,让我们来说明一下解决这个问题的思路:

  1. 我们可以模拟一个顺时针螺旋的运动路径,从左上角开始,逐渐向右、向下、向左、向上移动,每次移动时都会更新边界。
  2. 我们使用四个边界变量来跟踪当前处理的矩阵范围:top,bottom,left,right。
  3. 我们初始化这些边界变量,然后在每个方向上移动,同时添加当前元素到结果数组中,然后更新边界变量。
  4. 我们继续这个过程,直到遍历完所有元素。

接下来,让我们通过带有注释的 JavaScript 代码来实现这个算法:

function spiralOrder(matrix) {
  if (!matrix || matrix.length === 0 || matrix[0].length === 0) {
    return [];
  }

  const result = [];
  let top = 0,
    bottom = matrix.length - 1,
    left = 0,
    right = matrix[0].length - 1;

  while (top <= bottom && left <= right) {
    // 从左到右
    for (let i = left; i <= right; i++) {
      result.push(matrix[top][i]);
    }
    top++; // 上边界向下收缩

    // 从上到下
    for (let i = top; i <= bottom; i++) {
      result.push(matrix[i][right]);
    }
    right--; // 右边界向左收缩

    // 从右到左
    if (top <= bottom) {
      for (let i = right; i >= left; i--) {
        result.push(matrix[bottom][i]);
      }
      bottom--; // 下边界向上收缩
    }

    // 从下到上
    if (left <= right) {
      for (let i = bottom; i >= top; i--) {
        result.push(matrix[i][left]);
      }
      left++; // 左边界向右收缩
    }
  }

  return result;
}

// 示例用法
const matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
];

const result = spiralOrder(matrix);
console.log(result); // 输出 [1, 2, 3, 6, 9, 8, 7, 4, 5]

这段代码将会按照题目要求,以顺时针螺旋顺序返回矩阵中的所有元素。