Solution: Spiral Matrix
Let's solve the Spiral Matrix problem using the Matrices pattern.
We'll cover the following
Statement
Given an $m\times n$ matrix, return an array containing the matrix elements in spiral order, starting from the topleft cell.
Constraints:
 $1\leq$
matrix.length
$\leq 10$  $1\leq$
matrix[i].length
$\leq 10$  $100\leq$
matrix[i][j]
$\leq 100$
Solution
The essence of the spiral order traversal algorithm for matrices lies in navigating through the matrix in a spiral patternâ€”initially moving lefttoright, then toptobottom, followed by righttoleft, and finally bottomtotop, 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 $1$ or $1$. Its value will change based on the following rules:

It will be $1$ if weâ€™re traveling in the following directions:
 Left to right (horizontal)
 Top to bottom (vertical)

It will be $1$ 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 $1$ 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 $1$ 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 $1$ 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 $1$:
Now, we travel from right to left in a row by adding the
direction
variable (which is now $1$) 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 $1$ 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 $1$) 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 $1$ 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 $1$. 
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:
Level up your interview prep. Join Educative to access 80+ handson prep courses.