剑指offer-顺时针打印矩阵
描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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 class Solution { 2 public: 3 vector<int> printMatrix(vector<vector<int> > matrix) { 4 // 取宽和高的最小值确定圈数 5 // 每一圈从上右下左遍历,关键词:i n-i-1,开区间 6 int row=matrix.size(); 7 int col=matrix[0].size(); 8 int n=min(row,col); 9 // 如果最小值是计数的话,注意最后一圈只有一个数 10 int circle_num=n%2==0?n/2:(n-1)/2; // 考虑奇偶 11 vector<int> res; 12 int i=0; 13 for(;i<circle_num;++i){ 14 for(int j=i;j<col-i-1;++j){ // 列数才代表一行的长度 15 res.push_back(matrix[i][j]); 16 } 17 for(int j=i;j<row-i-1;++j){ // 行数才代表一列的长度 18 res.push_back(matrix[j][col-i-1]); 19 } 20 for(int j=col-i-1;j>i;--j){ 21 res.push_back(matrix[row-i-1][j]); 22 } 23 for(int j=row-i-1;j>i;--j){ 24 res.push_back(matrix[j][i]); 25 } 26 } 27 // 如果是奇数,就还得考虑追加一行或一列的情况 28 if(n%2!=0){ 29 if(row>=col){ // 追加行 30 for(int j=i;j<row-i;++j){ 31 res.push_back(matrix[j][i]); 32 } 33 }else{ // 追加列 34 for(int j=i;j<col-i;++j){ 35 res.push_back(matrix[i][j]); 36 } 37 } 38 } 39 return res; 40 } 41 };
心之所愿,永不相忘