Solution: Spiral Matrix
Let's solve the Spiral Matrix problem using the Matrices pattern.
Statement
Given an matrix, return an array containing the matrix elements in spiral order, starting from the top-left cell.
Constraints:
-
matrix.length
-
matrix[i].length
-
matrix[i][j]
Solution
The essence of the spiral order traversal algorithm for matrices lies in navigating through the matrix in a spiral pattern—initially moving left-to-right, then top-to-bottom, followed by right-to-left, and finally bottom-to-top, with this cycle repeating until all elements have been visited. The algorithm employs a direction variable to control the traversal direction, which alternates between positive and negative values to switch between these four directions.
Now, let’s look at the workflow of the implementation:
We’ll maintain a variable, direction
, which indicates the direction we need to travel in. It will store the value of either or . Its value will change based on the following rules:
-
It will be if we’re traveling in the following directions:
- Left to right (horizontal)
- Top to bottom (vertical)
-
It will be if we’re traveling in the following directions:
- Right to left (horizontal)
- Bottom to top (vertical)
Here’s how the algorithm works:
-
We initialize the following variables:
rows, cols = len(matrix), len(matrix[0])
: These are the total number of rows and columns in the matrix, respectively.row, col = 0, -1
: These are the pointers used to traverse the matrix.direction = 1
: This indicates the direction we need to travel in. It is initialized to since our first traversal will be in the left to right (horizontal) direction.result = []
: This array stores the matrix elements in spiral order.
-
We start the traversal from the top left cell in the matrix:
- We first travel from left to right in a row by adding the
direction
variable tocol
while keeping the value ofrow
unchanged. At each iteration, we will addmatrix[row][col]
toresult
. At the end of this row traversal, we decrementrows
by because if we traverse a column after this, we’ll traverse one less element. - Next, we travel from top to bottom in a column by adding the
direction
variable torow
while keeping the value ofcol
unchanged. At each iteration, we will addmatrix[row][col]
toresult
. At the end of this column traversal, we decrementcols
by because if we traverse a row after this, we’ll traverse one less element.
- We first travel from left to right in a row by adding the
-
We reverse the direction by multiplying the
direction
variable by :-
Now, we travel from right to left in a row by adding the
direction
variable (which is now ) tocol
while keeping the value ofrow
unchanged. At each iteration, we will addmatrix[row][col]
toresult
. At the end of this row traversal, we decrementrows
by because if we traverse a column after this, we’ll traverse one less element. -
Next, we travel from bottom to top in a col by adding the
direction
variable (which is now ) torow
while keeping the value ofcol
unchanged. At each iteration, we will addmatrix[row][col]
toresult
. At the end of this column traversal, we decrementcols
by because if we traverse a row after this, we’ll traverse one less element.
-
-
We again reverse the direction by multiplying the
direction
variable by . -
The four steps above are repeated until all the cells of the matrix have been traversed, after which
result
stores the spiral order, so we returnresult
.
Let’s look at the following illustration to get a better understanding of the solution: