Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5]
.
Solution:
we can collect the borders of the matrix, and then go collect the borders of the submatrix. Repeating collecting the border of submatrix gives us the number in spiral order.
Code:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if(matrix.empty()) return res;
dfs(matrix, 0,0, matrix.size() - 1, matrix[0].size() - 1, &res);
return res;
}
void dfs(vector<vector<int>>& matrix, int r_start, int c_start, int r_end, int c_end, vector<int> *res){
if(r_start > r_end || c_start > c_end) return;
int r = r_start;
int c = c_start;
//go right
while(c <= c_end){
res->push_back(matrix[r][c]);
c++;
}
//go down
c = c_end;
r = r_start + 1;
while(r<=r_end){
res->push_back(matrix[r][c]);
r++;
}
//go left
c = c_end - 1;
r = r_end;
while(c>=c_start && r != r_start){//r!=r_start is to check we are not going back the same row from right to left
res->push_back(matrix[r][c]);
c--;
}
//go up
c = c_start;
r = r_end - 1;
while(r>r_start && c!=c_end){//check if we are going back the same column bottom to top
res->push_back(matrix[r][c]);
r--;
}
<span style="white-space:pre"> </span>//go the next submatrix
dfs(matrix, r_start + 1, c_start + 1, r_end - 1, c_end - 1, res);
}
};