劍指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)地進行從左到右坡椒,從上到下就缆,從右到左帖渠,從下到上的打印“年輪”上的元素。

難點

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

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

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

有意思的地方

四條邊的打印前提條件具有遞進關系而非并列關系,即一個比一個條件更苛刻

?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;
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末桦踊,一起剝皮案震驚了整個濱河市椅野,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌籍胯,老刑警劉巖竟闪,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杖狼,居然都是意外死亡炼蛤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門蝶涩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來理朋,“玉大人,你說我怎么就攤上這事绿聘∷陨希” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵熄攘,是天一觀的道長兽愤。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么烹看? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任国拇,我火速辦了婚禮,結果婚禮上惯殊,老公的妹妹穿的比我還像新娘酱吝。我一直安慰自己,他們只是感情好土思,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布务热。 她就那樣靜靜地躺著,像睡著了一般己儒。 火紅的嫁衣襯著肌膚如雪崎岂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天闪湾,我揣著相機與錄音冲甘,去河邊找鬼。 笑死途样,一個胖子當著我的面吹牛江醇,可吹牛的內容都是我干的。 我是一名探鬼主播何暇,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼陶夜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了裆站?” 一聲冷哼從身側響起条辟,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宏胯,沒想到半個月后羽嫡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡肩袍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年厂僧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片了牛。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡颜屠,死狀恐怖,靈堂內的尸體忽然破棺而出鹰祸,到底是詐尸還是另有隱情甫窟,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布蛙婴,位于F島的核電站粗井,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜浇衬,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一删性、第九天 我趴在偏房一處隱蔽的房頂上張望适揉。 院中可真熱鬧,春花似錦、人聲如沸垃沦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宵呛。三九已至,卻和暖如春蚁阳,著一層夾襖步出監(jiān)牢的瞬間铃绒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工螺捐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颠悬,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓定血,卻偏偏與公主長得像椿疗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子糠悼,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內容