順時針打印矩陣(劍指offer 面試題29)

題目描述

輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字,例如,如果輸入如下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

題目分析

涉及循環輸出矩陣,注意畫出示意圖更容易找到題目的規律。

每環矩陣的輸出都是從下標爲(start,start)開始的,比如一開始的(0,0);循環繼續的條件是matrixRows >  start * 2 && matrixCols >  start * 2;

打印環的過程分別是從左往右,從上往下,從右往左,從下往上,注意不要重複打印矩陣中的元素,注意不是每個環都包含了四個方向,2*2的環,只有前三個方向;n*1的環,只有前兩個方向;1*n的環,只有第一個方向;四個方向都有的環,起碼是3*2的環。

注意利用vector<vector <int>> matrix表示的輸入數組,行列情況如下:int matRows = matrix.size();int matCols = matrix[0].size();

通過的代碼

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> result;
        if(matrix.empty())
            return result;
        int matRows = matrix.size();
        int matCols = matrix[0].size();
        if(matCols <= 0 && matRows <= 0)
            return result;
        int start = 0;
        while(matCols > start * 2  && matRows > start * 2)
        {
            int endx = matRows- 1 - start;
            int endy = matCols- 1 - start;
            if(start <= endy)
            {
                for(int i = start; i<=endy; ++i)
                {
                    result.push_back(matrix[start][i]);
                }
            }
            if(start < endx)
            {
                for(int i=start+1; i<=endx; ++i)
                {
                    result.push_back(matrix[i][endy]);
                }
            }
            if(start < endx && start < endy)
            {
                for(int i=endy-1; i>=start; --i)
                {
                    result.push_back(matrix[endx][i]);
                }
            }
            if(start < endx-1 && start < endy)
            {
                for(int i=endx-1; i>start; --i)
                {
                    result.push_back(matrix[i][start]);
                }
            }
            start++;
        }
        return result;
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章