class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix or not matrix[0]:
return list()
rows, columns = len(matrix), len(matrix[0])
visited = [[False] * columns for _ in range(rows)]
total = rows * columns
order = [0] * total
directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]
row, column = 0, 0
directionIndex = 0
for i in range(total):
order[i] = matrix[row][column]
visited[row][column] = True
nextRow, nextColumn = row + directions[directionIndex][0], column + directions[directionIndex][1]
if not (0 <= nextRow < rows and 0 <= nextColumn < columns and not visited[nextRow][nextColumn]):
directionIndex = (directionIndex + 1) % 4
row += directions[directionIndex][0]
column += directions[directionIndex][1]
return order
from typing import List
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix or not matrix[0]:
return []
order = []
rows = len(matrix)
cols = len(matrix[0])
top, bottom, left, right = 0, rows-1, 0, cols-1
while left <= right and top <= bottom:
for i in range(left, right+1):
order.append(matrix[top][i])
for i in range(top+1, bottom+1):
order.append(matrix[i][right])
if left < right and top < bottom:
for i in range(right-1, left, -1):
order.append(matrix[bottom][i])
for i in range(bottom, top, -1):
order.append(matrix[i][left])
top, bottom, left, right = top+1, bottom-1, left+1, right-1
return order