Search
⌘K
Matrices

Spiral Matrix

medium

DESCRIPTION (inspired by Leetcode.com)

Write a function to traverse an m x n matrix in spiral order and return all elements in a single list. The traversal should start from the top left corner and proceed clockwise, spiraling inward until every element has been visited.

Input:

matrix = [
    [0,1,2],
    [3,4,5],
    [6,7,8]
]

Output:

[0,1,2,5,8,7,6,3,4]

Explanation: The elements of the matrix are returned in the order they are visited in a clockwise spiral starting from the top left corner.

Explanation

This solution uses 4 steps to traverse the matrix in spiral order:

1. Top Row

The first step is to pop the first row of the matrix, while copying those elements into the result array from left to right.
Visualization
def spiral_order(matrix):
result = []
while matrix:
result += matrix.pop(0)
if matrix and matrix[0]:
for row in matrix:
result.append(row.pop())
if matrix:
result += matrix.pop()[::-1]
if matrix and matrix[0]:
for row in matrix[::-1]:
result.append(row.pop(0))
return result
012345678result[]

initialize result

0 / 1

2. Right Column

Next, we traverse the right column of the matrix, popping the last element of each remaining row in matrix and copying those elements into the result array from top to bottom.
Visualization
def spiral_order(matrix):
result = []
while matrix:
result += matrix.pop(0)
if matrix and matrix[0]:
for row in matrix:
result.append(row.pop())
if matrix:
result += matrix.pop()[::-1]
if matrix and matrix[0]:
for row in matrix[::-1]:
result.append(row.pop(0))
return result
345678result[0,1,2]

traverse top row

0 / 2

3. Bottom Row

Next, we traverse the bottom row of the matrix, popping the last row of matrix and copying those elements into the result array from right to left.
Visualization
def spiral_order(matrix):
result = []
while matrix:
result += matrix.pop(0)
if matrix and matrix[0]:
for row in matrix:
result.append(row.pop())
if matrix:
result += matrix.pop()[::-1]
if matrix and matrix[0]:
for row in matrix[::-1]:
result.append(row.pop(0))
return result
3467result[0,1,2,5,8]

traverse right column

0 / 1

4. Left Column

Finally, we traverse the left column of the matrix, popping the first element of each remaining row in matrix and copying those elements into the result array from bottom to top.
Visualization
def spiral_order(matrix):
result = []
while matrix:
result += matrix.pop(0)
if matrix and matrix[0]:
for row in matrix:
result.append(row.pop())
if matrix:
result += matrix.pop()[::-1]
if matrix and matrix[0]:
for row in matrix[::-1]:
result.append(row.pop(0))
return result
34result[0,1,2,5,8,7,6]

traverse bottom row

0 / 1

Repeat

At this point, we have traversed the perimeter of the original matrix in a clockwise spiral order. We repeat the process for the inner submatrix, until there are no more elements left to traverse.
Visualization
def spiral_order(matrix):
result = []
while matrix:
result += matrix.pop(0)
if matrix and matrix[0]:
for row in matrix:
result.append(row.pop())
if matrix:
result += matrix.pop()[::-1]
if matrix and matrix[0]:
for row in matrix[::-1]:
result.append(row.pop(0))
return result
4result[0,1,2,5,8,7,6,3]

traverse left column

0 / 2

Solution

|
2d-list of integers
Try these examples:
Visualization
def spiral_order(matrix):
result = []
while matrix:
result += matrix.pop(0)
if matrix and matrix[0]:
for row in matrix:
result.append(row.pop())
if matrix:
result += matrix.pop()[::-1]
if matrix and matrix[0]:
for row in matrix[::-1]:
result.append(row.pop(0))
return result
012345678

spiral matrix

0 / 8

Test Your Knowledge

Login to take the complexity quiz and track your progress

Complexity Analysis

Time Complexity: O(m * n) where m is the number of rows and n is the number of columns. We visit each element in the matrix once.

Space Complexity: O(m * n) for the result array that stores all matrix elements.

Mark as read

Your account is free and you can post anonymously if you choose.

Unlock Premium Coding Content

Interactive algorithm visualizations
Reading Progress

On This Page