输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.
思路:
这道题的意思非常直观,给人的感觉也是so easy,然而实际去做的时候会发现,如果结构划分的不好,会出现很多的循环,而且包括对各种边界条件的判定,题目不难,但是给人的感觉——很烦!我分享一下,我做这道题的思路。
循环条件怎么判定?一个矩阵,给定起点(startX,startY)和终点(endX,endY)(即位于对角线上的两个点)就可以打印一周,然后向里进一周(即++startX,++startY,--endX,--endY)即可,如果起始点坐标<终止点坐标(即startX<endX或者startY<endY)循环结束。
给定起点和终点,打印一周的结束条件是什么?我画了三种情况的矩阵4×4矩阵,3×5矩阵,5×3矩阵(所有矩阵无非就这三种类型,正方形的,偏“胖”的,偏“瘦”的),很快发现,只有三种情况:一直循环到结束,只剩下一行,只剩下一列。所以我们的函数首先判定:只有一行?打印该行;只有一列,打印该列。都不是,打印四条边上的数字。
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
//2017-6-21-周三
//思路:
//初始位置,末尾位置。就是对角线位置。
//if(matrix.size()==0) return ;
//初始位置startX,startY,endX,endY.
vector<int> temp;
int startX=0;int startY=0;
//行列呀
int endX=matrix.size()-1;
int endY=matrix[0].size()-1;
while((startX<=endX)&&(startY<=endY))
{
print(matrix,startX,startY,endX,endY,temp);
startX++;
startY++;
endX--;
endY--;
}
return temp;
}
//打印矩阵。
void print(vector<vector<int>> matrix,int startX,int startY,int endX,int endY,vector<int>& res)
{
//only one row
if(startX==endX)
{
for(int i=startY;i<=endY;i++)
res.push_back(matrix[startX][i]);
return ;
}
//only one coulum
if(startY==endY)
{
for(int i=startX;i<=endX;i++)
res.push_back(matrix[i][endY]);
return ;
}
/************************************
|------------------------------Y
-
-
-
-
-
-
X
********************/
//startX
// 从左到右
for(int i=startY;i<endY;i++)
res.push_back(matrix[startX][i]);
//从上到下
for(int i=startX;i<endX;i++)
res.push_back(matrix[i][endY]);
// 从右到左
for(int i=endY;i>startY;i--)
res.push_back(matrix[endX][i]);
//从上倒下
for(int i=endX;i>startX;i--)
res.push_back(matrix[i][startY]);
}
};