54. Spiral Matrix

Problem:

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

Example 1:

Input:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]

Example 2:

Input:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]

Solution:

Loop outside-in. Break each cycle into four stages. Note that the last two stages need at least two rows/columns.

/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
let spiralOrder = function (matrix) {
  const result = [];
  const height = matrix.length;
  if (height <= 1) {
    return matrix[0] || result;
  }
  const width = matrix[0].length;
  if (width <= 0) {
    return result;
  }

  const end = ((Math.min(width, height) + 1) / 2) | 0;
  for (let start = 0; start < end; start++) {
    const rowEnd = height - start - 1;
    const colEnd = width - start - 1;
    for (let col = start; col <= colEnd; col++) {
      result.push(matrix[start][col]);
    }
    for (let row = start + 1; row <= rowEnd; row++) {
      result.push(matrix[row][colEnd]);
    }
    if (rowEnd > start) {
      for (let col = colEnd - 1; col >= start; col--) {
        result.push(matrix[rowEnd][col]);
      }
    }
    if (colEnd > start) {
      for (let row = rowEnd - 1; row > start; row--) {
        result.push(matrix[row][start]);
      }
    }
  }
  return result;
};

: .。. o(≧▽≦)o .。.:☆☆: .。. o(≧▽≦)o .。.:☆☆: .。. o(≧▽≦)o .。.:



: .。. o(≧▽≦)o .。.:☆☆: .。. o(≧▽≦)o .。.: