54. Spiral Matrix

Leetcode

題目

Given an m x n matrix, return all elements of the matrix in spiral order.

解答

  • 方法一

每次都加入第一列,然後逆時針旋轉矩陣 90 度,再依次加入第一列

var spiralOrder = function(matrix) {
    var rotate = function(matrix) {
      const m = matrix.length;
      const n = matrix[0].length;
      const result = Array.from({length: n}, () => []);
      for(let i=0; i<m; i++) {
        for(let j=0; j<n; j++) {
          result[j].push(matrix[i][n-j-1]);
        }
      }

      return result
    }; 

    const result = [];
    while(matrix.length) {
      const next = matrix.splice(0, 1)[0];
      result.push(...next);
      if (matrix.length) {
        matrix = rotate(matrix);
      }
    }

    return result;
};

Runtime: 68 ms, faster than 88.47% of JavaScript online submissions for Spiral Matrix.

Memory Usage: 38.6 MB, less than 37.64% of JavaScript online submissions for Spiral Matrix.

  • 方法二

設定四個方向(往右 -> 往下 -> 往左 -> 往上),依序遍歷

var spiralOrder = function(matrix) {
  let startRow = 0;
  let startCol = 0;
  let endRow = matrix.length - 1;
  let endCol = matrix[0].length - 1;

  const result = [];
  while(true) {
    for(let i=startCol; i<=endCol; i++) {
      result.push(matrix[startRow][i]);
    }
    if(++startRow > endRow) break;

    for(let i=startRow; i<=endRow; i++) {
      result.push(matrix[i][endCol]);
    }
    if(startCol > --endCol) break;

    for(let i=endCol; i>=startCol; i--) {
      result.push(matrix[endRow][i]);
    }
    if(startRow > --endRow) break;

    for(let i=endRow; i>=startRow; i--) {
      result.push(matrix[i][startCol]);
    }
    if(++startCol > endCol) break;
  }

  return result;
};

Runtime: 68 ms, faster than 88.31% of JavaScript online submissions for Spiral Matrix.

Memory Usage: 38.9 MB, less than 18.59% of JavaScript online submissions for Spiral Matrix.

https://www.youtube.com/watch?v=HnP-pJLFZwY

測資

let matrix = [[1,2,3],[4,5,6],[7,8,9]]
matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]

console.log(spiralOrder(matrix));

參考資料

Last updated

Was this helpful?