劍指offer-順時針列印矩陣
阿新 • • 發佈:2021-07-28
描述
輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下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 };