旋转遍历矩阵。
这题是有子问题的,所以用递归解法比较简洁易读。
自然也可以用迭代解法,稍微烦一点。
class Solution {
public:
void _spiralOrder(vector<vector<int> > &matrix, int i, int j, int m, int n, vector<int> &res){
if(m<=0||n<=0)
return;
int p=i, q=j;
if(m==1){
while(q<(j+n))
res.push_back(matrix[i][q++]);
return;
}
if(n==1){
while(p<(i+m))
res.push_back(matrix[p++][j]);
return;
}
while(q<(j+n))
res.push_back(matrix[p][q++]);
--q;++p;
while(p<(i+m))
res.push_back(matrix[p++][q]);
--p;--q;
while(q>j)
res.push_back(matrix[p][q--]);
while(p>i)
res.push_back(matrix[p--][q]);
_spiralOrder(matrix,i+1,j+1,m-2,n-2,res);
}
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> res;
if(matrix.empty())
return res;
int m = matrix.size();
int n = matrix[0].size();
_spiralOrder(matrix,0,0,m,n,res);
return res;
}
};
其实写的好的迭代可以更简洁优雅的。
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> res;
if(matrix.empty())
return res;
int start_x = 0, start_y = 0, end_x = matrix.size()-1, end_y = matrix[0].size()-1;
while(true){
for(int i=start_y;i<=end_y;++i)
res.push_back(matrix[start_x][i]);
if(++start_x>end_x)
return res;
for(int i = start_x;i<=end_x;++i)
res.push_back(matrix[i][end_y]);
if(--end_y<start_y)
return res;
for(int i = end_y;i>=start_y;--i)
res.push_back(matrix[end_x][i]);
if(--end_x<start_x)
return res;
for(int i = end_x;i>=start_x;--i)
res.push_back(matrix[i][start_y]);
if(++start_y>end_y)
return res;
}
}