0054-spiral-matrix

Try it on leetcode

Description

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

 

Example 1:

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

Example 2:

Input: matrix = [[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]

 

Constraints:

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

Solution(Python)

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        #  matrix = [[1,2,3],[4,5,6],[7,8,9]]
        # Output: [1,2,3,6,9,8,7,4,5]
        #
        # spiral = []
        # 
        #  l -> r 1 2 3 
        #  u -> d 6 9 8
        #  r -> l 7 
        #  d -> u 4 
        #  l -> r 5
        # 
        # l -> r  u -> d  
        # r -> l  d -> u
        #
        #  l = 0, r=n-1
        #  u = 0, d = m -1
        # 
        #  len(spiral) = m*n
        #  i = 0  j= 0 -> r = n-1
        # 
        #  len(res) < m*n:
        #   i -> r
        #   j -> d
        #   if u != d
        #   i -> l
        #   if l != r
        #   j -> u
        #   update r,d,l,u

        spiral = []
        m,n = len(matrix), len(matrix[0])
        left = 0
        right = n - 1
        up = 0 
        down = m - 1

        while len(spiral) < m * n: #  matrix = [[1,2,3],[4,5,6],[7,8,9]]   l  =1 r = 2, u = 1 , d = 2
            for j in range(left , right + 1): # 1 2 3
                spiral.append(matrix[up][j]) # res = [0 1 2 ]


            for i in range(up + 1, down + 1): # 6 9
                spiral.append(matrix[i][right]) #  res = [0 1 2 6 ]

            if up != down: # 0!=3
                for j in range(right - 1 , left - 1, - 1): # 87 
                    spiral.append(matrix[down ][j]) # res = [0 1 2 6 9 8]
            if right != left: # 0!=3
                for i in range(down - 1 , up, -1): # 2 1
                    spiral.append(matrix[i][left])   # res = [0 1 2 6 9 8 7 4 5]

            left += 1 # l = 1
            right -= 1 # r = 2
            up += 1 # u = 1
            down -= 1 # d  = 2
        return spiral

Dry Run