19.顺时针打印矩阵——剑指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> res;
 4     void Matrix(int begin , vector<vector<int> > matrix , int size , int length){
 5         int i = begin;
 6         int j = begin;
 7         int k;
 8         if(size <= 0 || length <= 0) {
 9             return;
10         }
11           if(size == 1) {
12             for(int k = 0; k < length ; ++k){
13             res.push_back(matrix[i][j]);
14             ++j;
15         }
16               return;
17         }
18            if(length == 1) {
19             for(int k = 0; k < size ; ++k){
20             res.push_back(matrix[i][j]);
21             ++i;
22         }
23               return;
24         }
25         for(int k = 0; k < length - 1; ++k){
26             res.push_back(matrix[i][j]);
27             ++j;
28         }
29         for(int k = 0; k < size - 1; ++k){
30             res.push_back(matrix[i][j]);
31             ++i;
32         }
33         for(int k = 0; k < length - 1; ++k){
34             res.push_back(matrix[i][j]);
35             --j;
36         }
37         for(int k = 0; k < size - 1; ++k){
38             res.push_back(matrix[i][j]);
39             --i;
40         }
41         Matrix(begin + 1 , matrix , size -2,length - 2);
42     }
43     vector<int> printMatrix(vector<vector<int> > matrix) {
44       Matrix(0 , matrix , matrix.size(),matrix[0].size());
45         return res;
46     }
47 };
 4 /*解题思路:顺时针打印就是按圈数循环打印,一圈包含两行或者两列,在打印的时候会出现某一圈中只包含一行,要判断从左向右打印和从右向左打印的时候是否会出现重复打印,同样只包含一列时,要判断从上向下打印和从下向上打印的时候是否会出现重复打印的情况*/
 5 class Solution {
 6 public:
 7     vector<int> printMatrix(vector<vector<int> > matrix) {
 8         vector<int>res;
 9         res.clear();
10         int row=matrix.size();//行数
11         int collor=matrix[0].size();//列数
12         //计算打印的圈数
13         int circle=((row<collor?row:collor)-1)/2+1;//圈数
14         for(int i=0;i<circle;i++){
15             //从左向右打印
16             for(int j=i;j<collor-i;j++)
17                 res.push_back(matrix[i][j]);         
18             //从上往下的每一列数据
19             for(int k=i+1;k<row-i;k++)
20                 res.push_back(matrix[k][collor-1-i]);
21             //判断是否会重复打印(从右向左的每行数据)
22             for(int m=collor-i-2;(m>=i)&&(row-i-1!=i);m--)
23                 res.push_back(matrix[row-i-1][m]);
24             //判断是否会重复打印(从下往上的每一列数据)
25             for(int n=row-i-2;(n>i)&&(collor-i-1!=i);n--)
26                 res.push_back(matrix[n][i]);}
27         return res;
28     }
29 };

 

posted @ 2019-05-19 17:24  unique_ptr  阅读(118)  评论(0编辑  收藏  举报