1. 程式人生 > 其它 >劍指offer-順時針列印矩陣

劍指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 };
心之所願,永不相忘