54. Spiral Matrix

Table of contents

Problem Statement
Given an m x n
matrix
, return all elements of the matrix
in spiral order. (link)
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
Solution
Use four pointers.
(left, right)
- These two pointers facilitate row iteration from left to right.(top, bottom)
- These two pointers facilitate column iteration from top to bottom.
Initially, we gather elements from the first row. Then, we increment the top pointer and move downward. Subsequently, we decrement the right pointer and move leftward. Following that, we decrement the bottom pointer and move upward.
This entire process continues only under the conditions top <= bottom and left <= right
.
There are only two edge cases that require special attention: one involving a single row and the other involving a single column.
Example 1 - matrix = [[4,5,1]]
Example 2 - matrix = [[4],[5],[1]]
A specific condition is needed when iterating through a row or column in the opposite directions (right to left or bottom to top), based on these two edge cases.
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
List<Integer> ans = new ArrayList<>();
int left = 0;
int right = n-1;
int top = 0;
int bottom = m-1;
//Both row and column indices should be valid
while(left<=right && top<=bottom){
for(int i=left; i<=right; i++){
ans.add(matrix[top][i]);
}
top+=1;
for(int i=top; i<=bottom; i++){
ans.add(matrix[i][right]);
}
right-=1;
//Only for single column check
if(top<=bottom){
for(int i=right; i>=left; i--){
ans.add(matrix[bottom][i]);
}
}
bottom-=1;
//Only for single row check
if(left<=right){
for(int i=bottom; i>=top; i--){
ans.add(matrix[i][left]);
}
}
left+=1;
}
return ans;
}
}
Subscribe to my newsletter
Read articles from Chetan Datta directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Chetan Datta
Chetan Datta
I'm someone deeply engrossed in the world of software developement, and I find joy in sharing my thoughts and insights on various topics. You can explore my exclusive content here, where I meticulously document all things tech-related that spark my curiosity. Stay connected for my latest discoveries and observations.