Skip to content
On this page

54. Spiral Matrix

https://leetcode.com/problems/spiral-matrix/

js
/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function(matrix) {
  if (!matrix.length) {
    return []
  }

  var top = 0
  var bottom = matrix.length - 1
  var left = 0
  var right = matrix[0].length - 1
  var direction = 0
  var result = []

  while (true) {
    if (direction === 0) {
      for (let i = left; i <= right; i++) {
        result.push(matrix[top][i])
      }
      top++
    } else if (direction === 1) {
      for (let i = top; i <= bottom; i++) {
        result.push(matrix[i][right])
      }
      right--
    } else if (direction === 2) {
      for (let i = right; i >= left; i--) {
        result.push(matrix[bottom][i])
      }
      bottom--
    } else if (direction === 3) {
      for (let i = bottom; i >= top; i--) {
        result.push(matrix[i][left])
      }
      left++
    }

    if (top > bottom || left > right) {
      return result
    }

    direction = (++direction) % 4
  }
}
py
class Solution(object):

    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        if not matrix:
            return []

        top, bottom, left, right = 0, len(matrix) - 1, 0, len(matrix[0]) - 1
        direction = 0
        result = []

        while True:
            if direction == 0:
                for i in range(left, right + 1):
                    result.append(matrix[top][i])
                top += 1
            elif direction == 1:
                for i in range(top, bottom + 1):
                    result.append(matrix[i][right])
                right -= 1
            elif direction == 2:
                for i in range(right, left - 1, -1):
                    result.append(matrix[bottom][i])
                bottom -= 1
            elif direction == 3:
                for i in range(bottom, top - 1, -1):
                    result.append(matrix[i][left])
                left += 1

            if top > bottom or left > right:
                return result

            direction = (direction + 1) % 4