曾格的github

剑指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. 根据宽度和高度确定打印的圈数(注意奇偶)
  2. 每一圈分上右下左四条边打印(注意开闭区间)
  3. 打印剩下的一行或一列

代码

 

 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 };

 

 

 

posted @ 2021-07-28 18:46  曾格  阅读(33)  评论(0编辑  收藏  举报
Live2D