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.類似{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;
    }
};