题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
也是比较蠢了,提交了很多遍都是段错误,遂用VS断点一句句看,发现少判断了只有两列的情况。思路很简单:
1.每次读一圈最外围的数据进vector;
2.把最外围的数据删掉;
3.重复步骤1、2直到矩阵size为0。
#include <assert.h> class Solution {
private:
vector<int> vec;
int tmp,M,N,m,n;
void sorted(vector<vector<int> >& a){
if(a.empty()) return;
M = a.size();
N = a[0].size();
m = 0;
n = 0;
while(n<N){
tmp = a[m][n];
vec.push_back(tmp);
n++;
}
if(M == 1) return;//判断只有一行的情况
n--;//因为在上一个循环n=N,已经越界了所以-1
m++;//跳过已读取的
while(m<M){
tmp = a[m][n];
vec.push_back(tmp);
m++;
}
if(N == 1) return;//判断只有一列的情况
m--;
n--;
while(n>=0){
tmp = a[m][n];
vec.push_back(tmp);
n--;
}
n++;
m--;
while(m>0){
tmp = a[m][n];
vec.push_back(tmp);
m--;
}
a.erase(a.begin());
a.erase(a.end()-1);
if(a.size()==0) return;//判断只有两行的情况
int num = a.size();
if (a[0].size() == 2) return;//判断只有两列的情况
for(int i = 0;i<num;i++){
a[i].erase(a[i].begin());
if(a[i].size()!=0)
a[i].erase(a[i].end()-1);
}
sorted(a);
}
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
assert(!matrix.empty());
sorted(matrix);
return vec;
}
};