每天一題LeetCode【第39天】

T54. Spiral Matrix【Medium

題目

給一個(gè) m × n 的矩陣(m 行,n 列),按螺旋順序返回所有元素。

例如,

給出如下矩陣:

[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]

你應(yīng)該返回: [1,2,3,6,9,8,7,4,5]

思路

看到這道題我的反應(yīng)是遞歸什么的,然而當(dāng)我看到 Top Solution 的時(shí)候,仿佛打開了新世界的大門,雖然說代碼很長,但是,差不多一看就知道代碼的意思,因?yàn)樗褪峭昝榔鹾狭宋覀儾挥么a解決這個(gè)問題的思路。

就是,哈哈: 拿只筆畫圈圈!

你沒有看錯(cuò),你只要像我這樣畫一個(gè)這么難看的圖片,這就是本題的思路了!

畫圈圈時(shí)有兩個(gè)點(diǎn):

① 畫完一行(列),下次再到這行(列)時(shí)會(huì)畫它的內(nèi)圈

② 當(dāng)畫到最后,兩線不能相交(就是下面的 boundriesCrossed 的作用)

代碼

代碼取自 Top Solution,稍作注釋

public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> spiralList = new ArrayList<Integer>();
        if(matrix == null || matrix.length == 0) return spiralList;
        // 設(shè)置初始值
        int top = 0;
        int bottom = matrix.length - 1;
        int left = 0;
        int right = matrix[0].length - 1;

        while(true){
            // 畫上面的那行
            for(int j=left; j <=right;j++){
                spiralList.add(matrix[top][j]);
            }
            //下一次內(nèi)行
            top++;
            //每畫一行(列) 判斷下一行(列)有沒有越界,有的話跳出循環(huán)
            if(boundriesCrossed(left,right,bottom,top))
                break;

            // 畫最右邊的列
            for(int i=top; i <= bottom; i++){
                spiralList.add(matrix[i][right]);
            }
            //下一次內(nèi)列
            right--;
            if(boundriesCrossed(left,right,bottom,top))
                break;

            //畫下面的那行
            for(int j=right; j >=left; j--){
                spiralList.add(matrix[bottom][j]);
            }
            //下一次內(nèi)行
            bottom--;
            if(boundriesCrossed(left,right,bottom,top))
                break;

            //畫左邊的列
            for(int i=bottom; i >= top; i--){
                spiralList.add(matrix[i][left]);
            }
            //下一次內(nèi)列
            left++;
            if(boundriesCrossed(left,right,bottom,top))
                break;
        }

        return spiralList;
    }

    //每畫一行(列) 判斷下一行(列)有沒有越界,有的話跳出循環(huán)
public boolean boundriesCrossed(int left,int right,int bottom,int top){
     if(left>right || bottom<top)
         return true;
     else
         return false;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,923評(píng)論 0 33
  • T59. Spiral Matrix II【Medium】 題目 給一個(gè)整數(shù) n,構(gòu)造一個(gè) 1~n2 的螺旋排序的...
    草稿紙反面閱讀 440評(píng)論 0 1
  • 動(dòng)態(tài)規(guī)劃(Dynamic Programming) 本文包括: 動(dòng)態(tài)規(guī)劃定義 狀態(tài)轉(zhuǎn)移方程 動(dòng)態(tài)規(guī)劃算法步驟 最長...
    廖少少閱讀 3,654評(píng)論 0 18
  • 妻子扯著嗓子在客廳叫喚我的名字,我假裝聽不見繼續(xù)玩著我的手機(jī)游戲。 早在結(jié)婚以前我就領(lǐng)教過妻子的潑辣,對(duì)于她的大嗓...
    意小禮閱讀 1,006評(píng)論 20 7
  • 這好像是最無所事事最墮落的一個(gè)周末。 兩天里也就收獲了一部經(jīng)典電影《霸王別姬》,看了無數(shù)個(gè)舞蹈視頻,書本也只停...
    萌噠噠de橙子君閱讀 324評(píng)論 0 0

友情鏈接更多精彩內(nèi)容