[Medium] 54. Spiral Matrix
Given an m x n matrix, return all elements of the matrix in spiral order.
Examples
Example 1:
Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
Constraints
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 10
- -100 <= matrix[i][j] <= 100
Thinking Process
There are two main approaches to solve this problem:
- Boundary Tracking: Use four boundaries (top, bottom, left, right) and traverse in spiral order
- Direction Simulation: Use direction vectors and mark visited cells to simulate spiral movement
Common Approaches
Typical techniques for this pattern:
| Approach | Time | Space | Notes |
|---|---|---|---|
| Row/column traversal | O(nm) | O(1) | Simulation, spiral |
| BFS/DFS on grid | O(nm) | O(nm) | Islands, shortest path |
| Matrix as graph (this problem) | O(nm) | O(nm) | 4/8-directional neighbors |
| Transpose / rotate | O(nm) | O(1) | In-place rotation tricks |
Solution
java
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> result = new ArrayList<>();
if (matrix.length == 0) return result;
int top = 0, bottom = matrix.length - 1, left = 0, right = matrix[0].length - 1;
while (top <= bottom && left <= right) {
for (int j = left; j <= right; j++) result.add(matrix[top][j]);
top++;
for (int i = top; i <= bottom; i++) result.add(matrix[i][right]);
right--;
if (top <= bottom) {
for (int j = right; j >= left; j--) result.add(matrix[bottom][j]);
bottom--;
}
if (left <= right) {
for (int i = bottom; i >= top; i--) result.add(matrix[i][left]);
left++;
}
}
return result;
}
}
Solution Explanation
Approach: Matrix as graph (this problem)
Key idea: There are two main approaches to solve this problem:
How the code works:
- Boundary Tracking: Use four boundaries (top, bottom, left, right) and traverse in spiral order
- Direction Simulation: Use direction vectors and mark visited cells to simulate spiral movement
Walkthrough — input matrix = [[1,2,3],[4,5,6],[7,8,9]], expected output [1,2,3,6,9,8,7,4,5]:
- Initialize variables from the problem setup.
- Apply the main loop / recursion until the condition is met.
- Confirm the result matches the expected output.
Common Mistakes
- Off-by-one errors in boundary conditions
- Not handling single row/column cases properly
- Incorrect boundary updates after each spiral
- Missing edge cases for 1x1 matrices
Related Problems
References
- LC 54: Spiral Matrix on LeetCode
- LeetCode Discuss — LC 54: Spiral Matrix
- LeetCode Editorial (may require premium)
Key Takeaways
- Boundary Management: Track four boundaries and move them inward after each complete spiral
- Edge Cases: Handle single row/column matrices with conditional checks
- Direction Changes: Use direction vectors to simulate spiral movement
- Visited Marking: Mark cells as visited to avoid revisiting them