Spiral Matrix Traversal in DSA C - Time & Space Complexity
We want to understand how the time needed to traverse a matrix in a spiral 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.
void spiralTraversal(int matrix[][N], int rows, int cols) {
int top = 0, bottom = rows - 1;
int left = 0, right = cols - 1;
while (top <= bottom && left <= right) {
for (int i = left; i <= right; i++) printf("%d ", matrix[top][i]);
top++;
for (int i = top; i <= bottom; i++) printf("%d ", matrix[i][right]);
right--;
if (top <= bottom) {
for (int i = right; i >= left; i--) printf("%d ", matrix[bottom][i]);
bottom--;
}
if (left <= right) {
for (int i = bottom; i >= top; i--) printf("%d ", matrix[i][left]);
left++;
}
}
}
This code prints all elements of a matrix in a spiral order starting from the top-left corner.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Visiting each element of the matrix exactly once.
- How many times: Each element is printed once during the spiral traversal loops.
As the matrix size grows, the number of elements to visit grows too.
| Input Size (n x n) | Approx. Operations (elements visited) |
|---|---|
| 10 x 10 | 100 |
| 100 x 100 | 10,000 |
| 1000 x 1000 | 1,000,000 |
Pattern observation: The operations grow proportionally to the total number of elements, which is the square of the matrix dimension.
Time Complexity: O(rows * cols)
This means the time grows directly with the total number of elements in the matrix.
[X] Wrong: "Because there are nested loops, the time complexity must be O(n²) regardless of matrix shape."
[OK] Correct: The loops do not multiply the work repeatedly; each element is visited once, so the total work is proportional to the number of elements, not squared again.
Understanding how to analyze traversal of 2D structures like matrices is a key skill. It shows you can reason about loops and data size clearly, which helps 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 moving around the edges of the matrix and gradually moving inward in a circular way.Step 2: Compare options
Only Traverse the matrix in a circular pattern from outer to inner layers describes moving in a circular pattern from outer to inner layers, which matches spiral traversal.Final Answer:
Traverse the matrix in a circular pattern from outer to inner layers -> Option DQuick Check:
Spiral traversal = circular outer to inner [OK]
- Confusing spiral with row-wise traversal
- Thinking spiral means diagonal traversal
- Ignoring the inward movement after outer layer
m x n matrix?Solution
Step 1: Identify correct boundary initialization
For spiral traversal, top starts at 0, bottom at last row (m-1), left at 0, right at last column (n-1).Step 2: Match with options
int top = 0, bottom = m-1, left = 0, right = n-1; matches this initialization exactly; others swap or mix row and column indices incorrectly.Final Answer:
int top = 0, bottom = m-1, left = 0, right = n-1; -> Option AQuick Check:
Boundaries = top=0, bottom=m-1, left=0, right=n-1 [OK]
- Swapping m and n in bottom or right
- Starting top or left at max index
- Confusing row and column boundaries
int matrix[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int top=0, bottom=2, left=0, right=2;
while(top <= bottom && left <= right) {
for(int i=left; i<=right; i++) printf("%d ", matrix[top][i]);
top++;
for(int i=top; i<=bottom; i++) printf("%d ", matrix[i][right]);
right--;
if(top <= bottom) {
for(int i=right; i>=left; i--) printf("%d ", matrix[bottom][i]);
bottom--;
}
if(left <= right) {
for(int i=bottom; i>=top; i--) printf("%d ", matrix[i][left]);
left++;
}
}Solution
Step 1: Trace first outer layer traversal
Top row left to right: 1 2 3; then right column top to bottom: 6 9; bottom row right to left: 8 7; left column bottom to top: 4.Step 2: Move inward and print center
Now top=1, bottom=1, left=1, right=1; print center element matrix[1][1] = 5.Final Answer:
1 2 3 6 9 8 7 4 5 -> Option BQuick Check:
Spiral order = 1 2 3 6 9 8 7 4 5 [OK]
- Skipping center element
- Mixing row and column indices
- Not updating boundaries correctly
int top=0, bottom=2, left=0, right=2;
while(top < bottom && left < right) {
for(int i=left; i<=right; i++) printf("%d ", matrix[top][i]);
top++;
for(int i=top; i<=bottom; i++) printf("%d ", matrix[i][right]);
right--;
for(int i=right; i>=left; i--) printf("%d ", matrix[bottom][i]);
bottom--;
for(int i=bottom; i>=top; i--) printf("%d ", matrix[i][left]);
left++;
}Solution
Step 1: Analyze loop condition
The conditiontop < bottom && left < rightstops before the center element is processed in odd-sized matrices.Step 2: Correct condition for full traversal
Using <= allows the loop to run when top equals bottom or left equals right, ensuring center elements are included.Final Answer:
The while loop condition should use <= instead of < -> Option CQuick Check:
Use <= in while condition for complete spiral [OK]
- Stopping traversal too early
- Changing for loop bounds incorrectly
- Swapping top and bottom variables
int matrix[4][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};Write the spiral traversal output if you start from the bottom-left corner and move clockwise inward.
Solution
Step 1: Understand starting point and direction
Start at bottom-left (matrix[3][0] = 13) and move clockwise: up, right, down, left, inward.Step 2: Trace spiral clockwise from bottom-left
Up column: 13 9 5 1; right row: 2 3 4; down column: 8 12 16; left row: 15 14 10 6; then inner spiral: 7 11.Final Answer:
13 9 5 1 2 3 4 8 12 16 15 14 10 6 7 11 -> Option AQuick Check:
Start bottom-left clockwise spiral = 13 9 5 1 2 3 4 8 12 16 15 14 10 6 7 11 [OK]
- Starting from top-left instead of bottom-left
- Moving counter-clockwise instead of clockwise
- Mixing row and column indices
Ready to prove it?
Pass the test and this pattern moves unknown
