题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.
题目分析
这个题目的思路比较简单,但是很容易陷入一个一个结点去找,坐标的思维中这样的方法很难实现。左神的课中也有原题。 但是对代码能力要求挺高的。
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> res;//定义存数据的矩阵
res.clear();
int row=matrix.size();//行数
int col=matrix[0].size();//列数
//计算打印的圈数
int circle=((row<col?row:col)-1)/2+1;
for(int i=0;i<circle;i++){
//从左向右打印
for(int j=i;j<col-i;j++)
res.push_back(matrix[i][j]);
//从上往下的每一列数据
for(int k=i+1;k<row-i;k++)
res.push_back(matrix[k][col-i-1]);
//判断是否会重复打印(从右向左的每行数据)
for(int m=col-i-2;(m>=i)&&(row-i-1!=i);m--)
res.push_back(matrix[row-i-1][m]);
for(int n=row-i-2;(n>i)&&(col-i-1!=i);n--)
res.push_back(matrix[n][i]);
}
return res;
}
};
这是大佬写的。很优雅?
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> ret;
for (int x = 0, y = 0, up = 0, down = matrix.size() - 1, left = 0, right = matrix[0].size() - 1, f = 0;
left <= right && up <= down; ++y, ++x, ++left) {
for (; left <= right && up <= down && y <= right; ret.push_back(matrix[x][y++]));
for (++x, --y, ++up; left <= right && up <= down && x <= down; ret.push_back(matrix[x++][y]));
for (--y, --x, --right; left <= right && up <= down && y >= left; ret.push_back(matrix[x][y--]));
for (--x, ++y, --down; left <= right && up <= down && x >= up; ret.push_back(matrix[x--][y]));
}
return ret;
}
};
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
int tR=0;
int tC=0;
int dR=matrix.size()-1;
int dC=matrix[0].size()-1;
while(tR<=dR&&tC<=dC){
printEdge(matrix,tR++,tC++,dR--,dC--);
}
}
void printEdge(vector<vector<int> > m,int tR,int tC,int dR,int dC){
if(tR==dR){
for(int i=tC;i<=dC;i++){
printf('%d ',m[tR][i]);
//cout<<m[tR][i]<<" ";
}
else if(tC==dC){
for(int i=tR;i<=dR;i++){
cout<<m[i][tC]<<" ";
}
}
else{
int curC=tC;
int curR=tR;
while(curC!=dC){
cout<<m[tR][curC]+" ";
curC++;
}
while(curR!=dR){
cout<<m[curR][dC]+" ";
curR++;
}
while(curC!=tC){
cout<<m[dR][curC]+" ";
curC--;
}
while(curR!=tR){
cout<<m[curR][tC]+" ";
curR--;
}
}
}
}
};