剑指offer 20:顺时针打印矩阵
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
解题思路
此题为以矩阵中心为轴,顺时针输出一个数组,主要考察的点在于对最后一圈循环输出的边界条件把控。
将一圈顺时针输出定义为:
1.从左到右输出(上侧)
2.从上到下输出(右侧)
3.从右到左输出(下侧)
4.从下到上输出(左侧)
在正常的一圈中4步依次执行,但在最后一圈中2-4步可能只会执行其中个的一部分或不执行,需要根据此圈的形状进行判断。
C++代码实现:
class Solution { public: vector<int> printMatrix(vector<vector<int> > matrix) { vector<int> result; int row=matrix.size(); if(row==0){ return result; } int col=matrix[0].size(); if(col==0){ return result; } int start=0; while(start*2<row && col>start*2){ printCycle(matrix,result,row,col,start); start++; } return result; } void printCycle(const vector<vector<int> > & ori, vector<int> & result,int row,int col, int start){ int endrow=row-start-1; int endcol=col-start-1; for (int i=start;i<=endcol;i++){//从左向右打印一行 result.push_back(ori[start][i]); } if(endrow>start){ for (int i=start+1;i<=endrow;i++){//从上到下打印一列 result.push_back(ori[i][endcol]); } } if(endcol>start && endrow>start){ for (int i=endcol-1;i>=start;i--){//从右向左打印一行 result.push_back(ori[endrow][i]); } } if(endcol>start && endrow>start+1){ for (int i=endrow-1;i>start;i--){//从右向左打印一行 result.push_back(ori[i][start]); } } } };