题目描述如下:
代码思路:
我们知道,每次进行一次顺时针遍历,下一次遍历的的首元素肯定是在这个矩阵的主对角线上的,所以,我的思路是,编写一个push函数,完成每一次的一周遍历。需要传入对角线左上角和右下角的下标值(x1, y1),(x2,y2)。
值得注意的是,当x1==x2的时候只剩下一列,需要进行列遍历,并且退出递归,y1==y2的时候进行行遍历,这个同样也是递归出口。
附C++代码:
void push(vector<vector<int>>& matrix, vector<int> &ans, int x1, int y1,int x2, int y2){
if(x2<x1||y2<y1) return ;
if (x1 == x2){
for (int i = y1; i <= y2; i++) {
ans.push_back(matrix[x1][i]);
//cout<<matrix[x1][i]<<" ";
}
return ;
}
if (y1 == y2) {
for (int i = x1; i <= x2; i++){
ans.push_back(matrix[i][y2]);
//cout<<matrix[i][y2]<<" ";
}
return ;
}
for(int i=y1;i<y2;i++) //cout<<matrix[x1][i]<<" ";
ans.push_back(matrix[x1][i]);
for(int i=x1;i<x2;i++) //cout<<matrix[i][y2]<<" ";
ans.push_back(matrix[i][y2]);
for(int i=y2;i>y1;i--) //cout<<matrix[x2][i]<<" ";
ans.push_back(matrix[x2][i]);
for(int i=x2;i>x1;i--) //cout<<matrix[i][y1]<<" ";
ans.push_back(matrix[i][y1]);
push(matrix, ans,x1+1,y1+1, x2-1, y2-1);
}
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m =matrix.size(),n=matrix[0].size(), m_ind, n_ind;
m_ind=0;n_ind=0;
vector<int> ans;
push(matrix, ans,0,0,m-1,n-1);
return ans;
}
运行结果:
比较奇怪的是,C++运行速度有这么快么?
0ms也太逆天了。