Spiral Matrix Traversal in DSA C# - Time & Space Complexity
We want to understand how the time needed to read all elements in a matrix in a spiral order grows as the matrix size increases.
How does the number of steps change when the matrix gets bigger?
Analyze the time complexity of the following code snippet.
public List<int> SpiralOrder(int[][] matrix) {
List<int> result = new List<int>();
int top = 0, bottom = matrix.Length - 1;
int left = 0, right = matrix[0].Length - 1;
while (top <= bottom && left <= right) {
for (int i = left; i <= right; i++) result.Add(matrix[top][i]);
top++;
for (int i = top; i <= bottom; i++) result.Add(matrix[i][right]);
right--;
if (top <= bottom) {
for (int i = right; i >= left; i--) result.Add(matrix[bottom][i]);
bottom--;
}
if (left <= right) {
for (int i = bottom; i >= top; i--) result.Add(matrix[i][left]);
left++;
}
}
return result;
}
This code reads all elements of a 2D matrix in a spiral order, starting from the top-left corner and moving inward.
- Primary operation: Visiting each element of the matrix exactly once.
- How many times: Each element is accessed once in the nested loops inside the while loop.
As the matrix size grows, the number of elements to visit grows too, so the steps increase proportionally.
| Input Size (n x n) | Approx. Operations |
|---|---|
| 10 x 10 | 100 |
| 100 x 100 | 10,000 |
| 1000 x 1000 | 1,000,000 |
Pattern observation: The operations grow roughly by the square of the matrix dimension because every element is visited once.
Time Complexity: O(n * m)
This means the time grows directly with the total number of elements in the matrix, visiting each one once.
[X] Wrong: "The spiral traversal takes more time than just reading the matrix row by row because of the multiple loops inside the while loop."
[OK] Correct: Even though there are multiple loops, each element is visited only once, so the total steps are still proportional to the number of elements.
Understanding how to analyze traversal of 2D structures like matrices is a key skill. It shows you can reason about nested loops and how they relate to input size, which is common in many coding problems.
"What if the matrix was not rectangular but jagged (rows of different lengths)? How would the time complexity change?"
Practice
Spiral Matrix Traversal?Solution
Step 1: Understand traversal pattern
Spiral traversal means visiting matrix elements starting from the outer layer and moving inward in a circular pattern.Step 2: Identify the traversal goal
The goal is to visit every element exactly once in a spiral order, usually starting from the top-left corner.Final Answer:
To visit all elements of a matrix in a spiral order starting from the top-left corner -> Option AQuick Check:
Spiral traversal = visiting elements in spiral order [OK]
- Confusing spiral traversal with sorting
- Thinking it only visits diagonal elements
- Assuming it transposes the matrix
matrix?Solution
Step 1: Understand matrix dimensions in C#
matrix.GetLength(0) gives number of rows, matrix.GetLength(1) gives number of columns.Step 2: Set boundaries correctly
Top and left start at 0; bottom and right are last indices (length - 1) for rows and columns respectively.Final Answer:
int top = 0, bottom = matrix.GetLength(0) - 1, left = 0, right = matrix.GetLength(1) - 1; -> Option DQuick Check:
Correct boundary initialization = int top = 0, bottom = matrix.GetLength(0) - 1, left = 0, right = matrix.GetLength(1) - 1; [OK]
- Using matrix.Length which is total elements, not rows or columns
- Swapping rows and columns in GetLength calls
- Starting boundaries at 1 instead of 0
int[,] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
List<int> result = new List<int>();
int top = 0, bottom = 2, left = 0, right = 2;
while (top <= bottom && left <= right) {
for (int i = left; i <= right; i++) result.Add(matrix[top, i]);
top++;
for (int i = top; i <= bottom; i++) result.Add(matrix[i, right]);
right--;
if (top <= bottom) {
for (int i = right; i >= left; i--) result.Add(matrix[bottom, i]);
bottom--;
}
if (left <= right) {
for (int i = bottom; i >= top; i--) result.Add(matrix[i, left]);
left++;
}
}
Console.WriteLine(string.Join(", ", result));Solution
Step 1: Traverse top row left to right
Elements added: 1, 2, 3; then top moves from 0 to 1.Step 2: Traverse right column top to bottom
Elements added: 6, 9; right moves from 2 to 1.Step 3: Traverse bottom row right to left
Elements added: 8, 7; bottom moves from 2 to 1.Step 4: Traverse left column bottom to top
Elements added: 4; left moves from 0 to 1.Step 5: Repeat for inner layer
Now top=1, bottom=1, left=1, right=1; add element 5.Final Answer:
1, 2, 3, 6, 9, 8, 7, 4, 5 -> Option AQuick Check:
Spiral order of 3x3 matrix = 1, 2, 3, 6, 9, 8, 7, 4, 5 [OK]
- Not updating boundaries correctly after each side
- Skipping the inner elements
- Reversing traversal directions incorrectly
int top = 0, bottom = matrix.GetLength(0), left = 0, right = matrix.GetLength(1) - 1;
while (top <= bottom && left <= right) {
for (int i = left; i <= right; i++) Console.Write(matrix[top, i] + " ");
top++;
for (int i = top; i <= bottom; i++) Console.Write(matrix[i, right] + " ");
right--;
if (top <= bottom) {
for (int i = right; i >= left; i--) Console.Write(matrix[bottom, i] + " ");
bottom--;
}
if (left <= right) {
for (int i = bottom; i >= top; i--) Console.Write(matrix[i, left] + " ");
left++;
}
}Solution
Step 1: Check boundary initialization
bottom is set to matrix.GetLength(0), which is out of index range since indexing is zero-based.Step 2: Correct bottom boundary
bottom should be matrix.GetLength(0) - 1 to point to the last valid row index.Final Answer:
Change bottom to matrix.GetLength(0) - 1 to avoid index out of range -> Option BQuick Check:
Zero-based indexing means last index = length - 1 [OK]
- Using length instead of length - 1 for last index
- Removing boundary checks causing infinite loops
- Starting indices at 1 instead of 0
int[,] matrix = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};What is the spiral traversal output?
Solution
Step 1: Traverse top row left to right
Elements: 1, 2, 3, 4; top moves from 0 to 1.Step 2: Traverse right column top to bottom
Elements: 8, 12; right moves from 3 to 2.Step 3: Traverse bottom row right to left
Elements: 11, 10, 9; bottom moves from 2 to 1.Step 4: Traverse left column bottom to top
Elements: 5; left moves from 0 to 1.Step 5: Traverse inner row left to right
Elements: 6, 7; top moves from 1 to 2.Final Answer:
1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7 -> Option CQuick Check:
Spiral order of 3x4 matrix = 1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7 [OK]
- Mixing order of inner elements
- Skipping last inner row or column
- Confusing left and right boundaries
Ready to prove it?
Pass the test and this pattern moves unknown
