题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.
分析:本题并不会用到高级的数据结构或算法,但是涉及到多个循环和相关条件的判断,要考虑周全,理清思路再写。
代码1:自己的思路,感觉程序结构不够清晰
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> re;
int r=matrix.size();
int c=matrix[0].size();
int total=r*c;
int i=0,j=0;
int right_c=c,right_r=r;
int left_c=0,left_r=0;
while(total){
//从左到右打印
while(total>0&&j<right_c){
re.push_back(matrix[i][j]);
total--;
j++;
}
j--;
i++;
//从上到下打印
while(total>0&&i<right_r-1){
re.push_back(matrix[i][j]);
total--;
i++;
}
//从右到左打印
while(total>0&&j>=left_c){
re.push_back(matrix[i][j]);
total--;
j--;
}
j++;
i--;
//从下到上打印
while(total>0&&i>left_r){
re.push_back(matrix[i][j]);
total--;
i--;
}
i++;
j++;
right_c--;
right_r--;
left_c++;
left_r++;
}
return re;
}
};
代码2:参照剑指offer的思路
//参照剑指offer的思路
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> re;
int rows=matrix.size();
int cols=matrix[0].size();
int start=0;
while(rows>start*2&&cols>start*2){
printCircle(rows,cols,start,matrix,re);
start++;
}
return re;
}
void printCircle(int rows,int cols,int start,vector<vector<int> > matrix,vector<int> & re){
int endC=cols-start-1;
int endR=rows-start-1;
//从左到右打印一行
for(int i=start,j=start;j<=endC;j++)
re.push_back(matrix[i][j]);
//从上到下打印一列,至少有两行
if(endR-start>0){
for(int i=start+1,j=endC;i<=endR;i++)
re.push_back(matrix[i][j]);
}
//从右到左打印一行,至少有两行两列
if(endR-start>0&&endC-start>0){
for(int i=endR,j=endC-1;j>=start;j--)
re.push_back(matrix[i][j]);
}
//从下到上打印一列,至少有三行两列
if(endC-start>0&&endR-start>1){
for(int i=endR-1,j=start;i>start;i--)
re.push_back(matrix[i][j]);
}
}
};