劍指offer-順時針列印矩陣(陣列)
阿新 • • 發佈:2018-12-13
題目描述
輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下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.類似{1}這種1*1的矩陣
2.行向量(只有一行的矩陣)以及列向量(只有一列的矩陣)
3.m*n的矩陣
例子給的4*4的矩陣比較好思考,就是
從左到右,從上到下,從右到左,以及從下到上。
剛開始只寫了4*4矩陣的,後來遇到1.2兩種情況的矩陣跑不通,最終借鑑了討論裡“上地”這位朋友的思路,
就是從左往右和從上到下,這兩個方向是可以適用於1.2這兩類矩陣的輸出,輸出一行或者一列
重點就在於兩個if判斷,如果top!=bottom,也就是說這個矩陣不止只有一行,那麼才會有從右往左的這麼一個輸出,
如果不止只有一列,才會有從下到上的這樣一個輸出。
如果不加if判斷,那對2.這種矩陣,會多輸出一個數,因為for迴圈先輸出一個數再判斷條件。
class Solution { public: vector<int> printMatrix(vector<vector<int> > matrix) { int top=0,bottom=matrix.size()-1;//為行的上下限範圍 int left=0,right=matrix[0].size()-1; //列的上下限範圍 vector<int> res; int i,j; //i是行的下標,j是列的下標 while(top<=bottom&&left<=right){ for(i=top,j=left;j<=right;j++) //從左往右 res.push_back(matrix[i][j]); for(i=top+1,j=right;i<=bottom;i++) //從上往下 res.push_back(matrix[i][j]); if(top!=bottom) //如果不止一行,則有從右往左 for(i=bottom,j=right-1;j>=left;j--) res.push_back(matrix[i][j]); if(left!=right) //如果不止一列,則有從下往上 for(i=bottom-1,j=left;i>top;i--) res.push_back(matrix[i][j]); top++;left++;bottom--;right--; } return res; } };