劍指Offer(T20)順時針打印矩陣

題目

輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數(shù)字,例如,如果輸入如下矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數(shù)字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

解題思路

循環(huán)地進(jìn)行從左到右,從上到下,從右到左,從下到上的打印“年輪”上的元素。

難點(diǎn)

  • 怎么確定循環(huán)條件
    (1)每一圈打印的起始點(diǎn)都在45°對角線上,所以可以聲明一個start變量標(biāo)識起始打印點(diǎn)
    (2)由于(start+1)代表已經(jīng)打印的圈數(shù),2*max{start} < min{rows,columns}

  • 怎么確定四條邊的打印前提條件
    從左到右:子矩陣至少有一個元素
    從上到下:子矩陣至少有兩列
    從右到左:子矩陣至少有兩行兩列
    從下到上:子矩陣至少有三行兩列

  • 怎樣訪問四條邊上元素
    由于四條邊的元素,一旦起始點(diǎn)定了之后,其他所有元素的行標(biāo)和列標(biāo)范圍也就定了,因此可以確定endX,endY
    endX = columns - 1 - start
    endY = rows - 1 - start
    從左到右遍歷時,縱坐標(biāo)保持變?yōu)閥 = start,橫坐標(biāo)為x = start:1:endX
    從上到下遍歷時,橫坐標(biāo)保持不變x = endX,縱坐標(biāo)為y = (start+1):1:endY
    從右到左,y = endY, x = (endX-1):1:start
    從下到上,x = start, y = (endY-1):1:(start+1)

有意思的地方

四條邊的打印前提條件具有遞進(jìn)關(guān)系而非并列關(guān)系,即一個比一個條件更苛刻

?class Solution {
public:
    void PrintMatrixInCircle(vector<vector<int> > &matrix,int start, vector<int> &ret){
        int rows = (int)matrix.size();
        int columns = (int)matrix[0].size();
        int endX = (columns-1) - start;
        int endY = (rows-1) - start;
        // 從左到右
        for(int i = start; i <= endX; ++i){
            ret.push_back(matrix[start][i]);
        }
        
        // 從上到下,至少2行
        if(endY > start){
            for(int i = start+1;i <= endY;++i){
                ret.push_back(matrix[i][endX]);
            }
        }
        
        // 從右到左,至少2行2列
        if(endX > start && endY > start){
            for(int i = endX-1; i >= start; --i){
                ret.push_back(matrix[endY][i]);
            }
        }
        
        // 從下到上,至少有3行2列
        if(endY > start + 1 && endX > start){
            for(int i = endY-1; i >= start + 1; i--){
                ret.push_back(matrix[i][start]);
            }
        }
    }
    
    
    vector<int> printMatrix(vector<vector<int> > matrix) {
        int rows = (int)matrix.size();
        int columns = (int)matrix[0].size();
        vector<int> ret;
        if(matrix.size() == 0 || columns <=0 || rows <= 0) return ret;
        int start = 0;
        while(columns > start*2 && rows > start*2){
            PrintMatrixInCircle(matrix,start,ret);
            ++start;
        }
        
        return ret;
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容