劍指offer面試題03:二維數(shù)組中的查找

題目

在一個二維數(shù)組中,每一行都按照從左到右遞增的順序排序朴沿,每一列都按照從上到下遞增的順序排序。請完成一個函數(shù),輸入這樣的一個二維數(shù)組和一個整數(shù)办龄,判斷數(shù)組中是否含有該整數(shù)。

考察點和難度

  • 考察知識點:數(shù)組
  • 難度:4星(共5星)

分析

最簡單的求解方式是遍歷整個二維數(shù)組溯乒,可以查詢到是否有目標(biāo)值,但是時間復(fù)雜度為O(rows * cols)澡绩,面試官是不會滿意的。

為了降低時間復(fù)雜度俺附,需要運用該二維數(shù)組的特性肥卡,即橫向和縱向的遞增特性。

該二維數(shù)組中的任意一個點P事镣,其左前區(qū)域都小于點P的值步鉴,其右后區(qū)域都大于點P的值,因此可以利用該特性在查詢時縮小查詢范圍璃哟。

從最右上角的點P出發(fā)氛琢,如果點P的值等于目標(biāo)值,則直接輸出true沮稚;如果點P的值大于目標(biāo)值艺沼,可以往左查找第一個小于等于目標(biāo)值的點PL,此時點PL成為新的“右上角”蕴掏,且點PL的右后部分區(qū)域的數(shù)值由于肯定大于目標(biāo)值障般,因此可以被剔除出查詢范圍;如果點P的值小于目標(biāo)值盛杰,可以往下查詢第一個大于等于目標(biāo)值的點PD挽荡,此時點PD成為新的“右上角”,且點PD的左前部分區(qū)域的數(shù)值由于肯定小于目標(biāo)值即供,因此也可以被剔除出查詢范圍定拟。得到新的“右上角”之后,重復(fù)該操作逗嫡,就能遍歷整個二維數(shù)組來查詢目標(biāo)值青自,且由于只在橫向和縱向往左下角移動,剔除了無需查詢的區(qū)域范圍驱证,因此時間復(fù)雜度為O(rows + cols)延窜。

為什么從右上角出發(fā)開始查詢?對于右上角的點P來說抹锄,其左邊的數(shù)值都小于點P的值逆瑞,其下面的數(shù)值都大于點P的數(shù)值,當(dāng)給定目標(biāo)值之后伙单,如果目標(biāo)值小于點P的數(shù)值获高,那么點P所在列就可以被剔除;如果目標(biāo)值大于點P的數(shù)值吻育,那么點P所在行就可以被剔除念秧,這樣就縮小了查詢范圍。

從左下角出發(fā)扫沼,往右上角查詢也是可以的出爹。

代碼實現(xiàn)(java)

    public boolean hasNumInArray(int[][] array, int rows, int cols, int num) {
        // 檢查輸入?yún)?shù)
        if (array == null) {
            throw new NullPointerException();
        }
        if (rows < 1 || cols < 1) {
            throw new IllegalArgumentException();
        }
        int rowSize = array.length;
        if (rowSize != rows) {
            throw new IllegalArgumentException();
        }
        int colSize = array[0].length;
        if (colSize != cols) {
            throw new IllegalArgumentException();
        }

        // 從右上角數(shù)字開始庄吼,往左下角找目標(biāo)數(shù)字,理論上時間復(fù)雜度為O(rows+cols)
        int i = 0, j = cols - 1;
        while ((i <= (rows - 1)) && (j >= 0)) {
            // 判斷當(dāng)前右上角的值是否為目標(biāo)值
            if (array[i][j] == num) {
                return true;
            } else if (array[i][j] > num) {
                // 當(dāng)前右上角的值比目標(biāo)值大严就,則往左找新的“右上角”总寻,且新的“右上角”的右后部分區(qū)域由于肯定大于目標(biāo)值,因此可被剔除
                while ((j >= 0) && (array[i][j] > num)) {
                    j = j - 1;
                }
            } else {
                // 當(dāng)前右上角的值比目標(biāo)值小梢为,則往下找新的“右上角”渐行,且新的“右上角”的左前部分區(qū)域由于肯定小于目標(biāo)值,因此可被剔除
                while ((i <= (rows - 1) && (array[i][j]) < num)) {
                    i = i + 1;
                }
            }
        }
        return false;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铸董,一起剝皮案震驚了整個濱河市祟印,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粟害,老刑警劉巖蕴忆,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異悲幅,居然都是意外死亡套鹅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門汰具,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卓鹿,“玉大人,你說我怎么就攤上這事留荔∫魉铮” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵聚蝶,是天一觀的道長杰妓。 經(jīng)常有香客問我,道長碘勉,這世上最難降的妖魔是什么稚失? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮恰聘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吸占。我一直安慰自己晴叨,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布矾屯。 她就那樣靜靜地躺著兼蕊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪件蚕。 梳的紋絲不亂的頭發(fā)上孙技,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天产禾,我揣著相機與錄音,去河邊找鬼牵啦。 笑死亚情,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哈雏。 我是一名探鬼主播楞件,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼裳瘪!你這毒婦竟也來了土浸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彭羹,失蹤者是張志新(化名)和其女友劉穎黄伊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體派殷,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡还最,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了愈腾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憋活。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖虱黄,靈堂內(nèi)的尸體忽然破棺而出悦即,到底是詐尸還是另有隱情,我是刑警寧澤橱乱,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布辜梳,位于F島的核電站,受9級特大地震影響泳叠,放射性物質(zhì)發(fā)生泄漏作瞄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一危纫、第九天 我趴在偏房一處隱蔽的房頂上張望宗挥。 院中可真熱鬧,春花似錦种蝶、人聲如沸契耿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搪桂。三九已至,卻和暖如春盯滚,著一層夾襖步出監(jiān)牢的瞬間踢械,已是汗流浹背酗电。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留内列,地道東北人撵术。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像德绿,于是被迫代替她去往敵國和親荷荤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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

  • 題目:在一個二維數(shù)組中移稳,每一行都按照從左到右遞增的順序排序蕴纳,每一列都按照從上到下遞增的順序排序。請完成一個函數(shù)个粱,輸...
    minningl閱讀 430評論 0 0
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5古毛? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,513評論 1 45
  • 行人腳步?jīng)]有加快車輛沒有變多也沒變少店鋪都照常開著河水平靜如常樹枝偶爾搖擺沒有跡象表明一場超強臺風(fēng)即將到來 只有云...
    真小實閱讀 254評論 4 5
  • 滴答滴答 空氣中彌漫著難聞的酒氣 像極了深埋地里腐爛的記憶氣息 抹一把潮濕的腋下 咧開嘴 準(zhǔn)備一次緊張蹦極 嘿 多...
    晚生涼閱讀 455評論 0 0
  • 1 周末的時候都许,群里一個群友抱怨稻薇,他表妹在朋友圈幫人轉(zhuǎn)發(fā)了一個求治病捐款的眾籌,看了曬出的病例報告之后胶征,他非常氣憤...
    愛寫故事的提小莫閱讀 396評論 4 1