leetcode:顺时针螺旋顺序

291 阅读1分钟

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

示例 1:

  输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
  输出:[1,2,3,6,9,8,7,4,5]

示例 2:

  输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
  输出:[1,2,3,4,8,12,11,10,9,5,6,7]

提示:

  m == matrix.length
  n == matrix[i].length
  1 <= m, n <= 100
  -100 <= matrix[i][j] <= 100

顺时针旋转就是: 第一行->从左到右,最后一列->从上到下,最后一行->从右到左,第一列->从下到上

function spiralOrder(matrix: number[][]): number[] {
  //给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
  //示例 1:
  //输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
  //输出:[1,2,3,6,9,8,7,4,5]
  //示例 2:
  //输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
  //输出:[1,2,3,4,8,12,11,10,9,5,6,7]
  //提示:
  //m == matrix.length
  //n == matrix[i].length
  //1 <= m, n <= 100
  //-100 <= matrix[i][j] <= 100

  let res: number[] = [];
  if (matrix.length === 0) {
    return res;
  }
  let row = 0; // 行
  let col = 0; // 列
  let rowEnd = matrix.length - 1;
  let colEnd = matrix[0].length - 1;
  let direction = 0;
  while (row <= rowEnd && col <= colEnd) {
    if (direction === 0) {
      for (let i = col; i <= colEnd; i++) {
        res.push(matrix[row][i]);
      }
      row++;
    }
    if (direction === 1) {
      for (let i = row; i <= rowEnd; i++) {
        res.push(matrix[i][colEnd]);
      }
      colEnd--;
    }
    if (direction === 2) {
      for (let i = colEnd; i >= col; i--) {
        res.push(matrix[rowEnd][i]);
      }
      rowEnd--;
    }
    if (direction === 3) {
      for (let i = rowEnd; i >= row; i--) {
        res.push(matrix[i][col]);
      }
      col++
    }
    direction = (direction + 1) % 4;
  }

  return res;
}