26.螺旋矩阵【LC54】

110 阅读1分钟

题目:

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

image.png

image.png

核心思路:

这种矩阵问题,我们首要就是要确认怎么遍历,本题可以抽象为一圈一圈的剥掉。

通过不断缩小上下左右的边界循环找,如果下边界大于了上边界或者左边界大于了右边界,说明遍历完了。

解:

var spiralOrder = function (matrix) {
  if (!matrix || !matrix.length) {
    return [];
  }
  let L = 0,
    T = 0,
    R = matrix[0].length - 1,
    B = matrix.length - 1;
  // 四个序号指针,限定范围
  let res = [];

  while (L <= R && T <= B) {
    //遍历行
    for (let i = L; i <= R; i++) {
      res.push(matrix[T][i]);
    }
    // 剔除行,进入缩小矩阵行
    ++T;
    if (T > B) {
      break;
    }
    // 遍历列
    for (let i = T; i <= B; i++) {
      res.push(matrix[i][R])
    }
    // 剔除列,进入缩小矩阵列
    --R;
    if (L > R) {
      break;
    }
    for (let i = R; L <= i; i--) {
      res.push(matrix[B][i]);
    }
    --B;
    if (T > B) {
      break;
    }
    for (let i = B; T <= i; i--) {
      res.push(matrix[i][L]);
    }
    ++L;
    if (L > R) {
      break;
    }
  }
  return res;
};