【劍指offer題解】二維數(shù)組中的查找

image

前言

眾所周知,對于面試而言渔欢,《劍指offer》是一本“好書”墓塌。

如果你和我一樣是個(gè)算法菜雞,那么最推薦的是先把劍指offer的題目搞明白奥额,其次再去刷LeetCode等習(xí)題苫幢,這樣對于面試突擊非常有用,因?yàn)槊嬖嚬僮畛垫挨?嫉乃惴}都在這本書里韩肝。

如果你發(fā)現(xiàn)看這本書很吃力,可以先直接參考些網(wǎng)上的代碼九榔,照著抄一遍哀峻,理解下算法題是應(yīng)該解題,多抄幾道題目哲泊,你就對算法題的做法有感覺了剩蟀,這個(gè)高考做固定套路數(shù)學(xué)題是一樣的。

對于劍指offer題解這個(gè)系列切威,我的寫作思路是育特,對于看過文章的讀者,能夠做到:

  • 迅速了解該題常見解答思路(奇技淫巧不包括在內(nèi)牢屋,節(jié)省大家時(shí)間且预,實(shí)在有研究需求的人可以查閱其它資料)
  • 思路盡量貼近原書(例如書中提到的面試官經(jīng)常會(huì)要求不改變原數(shù)組,或者有空間限制等烙无,盡量體現(xiàn)在代碼中锋谐,保證讀者可以不漏掉書中細(xì)節(jié))
  • 盡量精簡話語,避免冗長解釋
  • 給出代碼可運(yùn)行截酷,注釋齊全涮拗,關(guān)注細(xì)節(jié)問題
  • 代碼能夠通過牛客網(wǎng)在線編程《劍指offer》測試

《劍指offer題解》系列

你可以通過以下幾種途徑查看我的《劍指offer題解》系列:

  • 關(guān)注我的公眾號:后端技術(shù)漫談迂苛,點(diǎn)擊公眾號導(dǎo)航欄:劍指offer題解
  • 劍指offer題解專欄(CSDN)
  • 各大博客平臺我的賬號(見本文最下方)

題目介紹

在一個(gè)二維數(shù)組中(每個(gè)一維數(shù)組的長度相同)三热,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序三幻。請完成一個(gè)函數(shù)就漾,輸入這樣的一個(gè)二維數(shù)組和一個(gè)整數(shù),判斷數(shù)組中是否含有該整數(shù)念搬。

解題思路

方法一

首先能夠想到的肯定是一行一行或者一列一列遍歷抑堡,判斷數(shù)組中是否含有該整數(shù)摆出。該方法顯然是最笨拙的二維數(shù)組遍歷,面試官也不會(huì)滿意首妖,時(shí)間復(fù)雜度是O(n^2)

代碼

Python

class Solution:
    def Find(self, target, array):
        for i in range(len(array)):
            for j in range(len(array[0])):
                if array[i][j]==target:
                    return True
        return False

方法二

我們思考下偎漫,既然大的數(shù)字都在靠右邊/下邊,能否能利用行列的數(shù)據(jù)變化規(guī)律來優(yōu)化下解法有缆,如果尋找的目標(biāo)數(shù)大于現(xiàn)在的數(shù)字象踊,那么目標(biāo)數(shù)字是在當(dāng)前位置的右邊或下邊,如果所尋找的目標(biāo)數(shù)小于現(xiàn)在的數(shù)字棚壁,那么目標(biāo)數(shù)字在當(dāng)前位置的左邊或上邊杯矩。舉個(gè)例子,如下圖數(shù)組所示:

1  2  3   4
2  3  8   9
3  4  9   10
4  5  10  11

我們的位置是1袖外,要找8菊碟,8大于1,那么在1的右邊和下邊區(qū)域進(jìn)行下一步的搜索在刺。

如果我們先搜索他的右邊,

2  3   4
3  8   9
4  9   10
5  10  11

又搜索了他們的下邊头镊,

2  3  8   9
3  4  9   10
4  5  10  11

這時(shí)候我們發(fā)現(xiàn)

3  8  9
4  9  10
5  10 11

這個(gè)區(qū)域搜索了兩次蚣驼,我們是從數(shù)組的第一個(gè)數(shù)[0][0]取的,遇到了重復(fù)搜索區(qū)域的問題相艇。有沒有方法去除重復(fù)的搜索區(qū)域呢颖杏,我們發(fā)現(xiàn),當(dāng)從右上角取第一個(gè)數(shù)的時(shí)候坛芽,可以去除重復(fù)的搜索區(qū)域,還是以這個(gè)數(shù)組為例,取4店煞,搜索8申鱼,發(fā)現(xiàn)8比4大,那么8不可能出現(xiàn)在4這一行活喊,只需要從下邊搜索即可丐膝。如果尋找3,3比4小钾菊,4那一列后續(xù)的數(shù)都大于4帅矗,只需要從左邊搜索即可。

1  2  3   4
2  3  8   9
3  4  9   10
4  5  10  11

我們還可以發(fā)現(xiàn)左下角的點(diǎn)也可以去除重復(fù)搜索區(qū)域煞烫,總結(jié)起來的話浑此,有點(diǎn)像變量控制法的感覺,將一個(gè)變量控制住滞详,根據(jù)另外一個(gè)變量的規(guī)律凛俱,得出結(jié)論紊馏。

這樣我們將時(shí)間復(fù)雜度降為了O(n)

代碼

Java

public class Solution {
    public boolean Find(int target, int [][] array) {
        int rows = array.length;
        int cols = array[0].length;
        int i = rows-1, j = 0;
        while(i >= 0 && j < cols){
            if(target < array[i][j])
                i--;
            else if(target > array[i][j])
                j++;
            else
                return true;
        }
        return false;
    }
}

Python

class Solution:
    def Find(self, target, array):
        if array == ([] or [[]]):
            return False
        row = len(array)
        col = len(array[0])
        i=0
        j=col-1
        while 0<=i<row and 0<=j<col:
            if target>array[i][j]:
                i=i+1
            elif target<array[i][j]:
                j=j-1
            else:
                return True
        return False

總結(jié)

題目簡單,小伙伴們需要理解的是算法題應(yīng)該注重的是效率優(yōu)化最冰,暴力窮舉能夠解決問題瘦棋,但說服不了面試官。

我的《劍指offer題解》系列

你可以通過以下兩種途徑查看《劍指offer題解》系列:

關(guān)注我

我是一名后端開發(fā)工程師赌朋。

主要關(guān)注后端開發(fā),數(shù)據(jù)安全篇裁,爬蟲沛慢,物聯(lián)網(wǎng),邊緣計(jì)算等方向达布,歡迎交流团甲。

各大平臺都可以找到我

原創(chuàng)博客主要內(nèi)容

  • Java知識點(diǎn)復(fù)習(xí)全手冊
  • Leetcode算法題解析
  • 劍指offer算法題解析
  • SpringBoot菜鳥入門實(shí)戰(zhàn)系列
  • SpringCloud菜鳥入門實(shí)戰(zhàn)系列
  • 爬蟲相關(guān)技術(shù)文章
  • 后端開發(fā)相關(guān)技術(shù)文章
  • 逸聞趣事/好書分享/個(gè)人興趣

個(gè)人公眾號:后端技術(shù)漫談

公眾號:后端技術(shù)漫談.jpg

如果文章對你有幫助,不妨收藏黍聂,投幣躺苦,轉(zhuǎn)發(fā),在看起來~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末产还,一起剝皮案震驚了整個(gè)濱河市匹厘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脐区,老刑警劉巖愈诚,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異牛隅,居然都是意外死亡炕柔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門媒佣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匕累,“玉大人,你說我怎么就攤上這事丈攒×ㄗ铮” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵巡验,是天一觀的道長际插。 經(jīng)常有香客問我,道長显设,這世上最難降的妖魔是什么框弛? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮捕捂,結(jié)果婚禮上瑟枫,老公的妹妹穿的比我還像新娘斗搞。我一直安慰自己,他們只是感情好慷妙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布僻焚。 她就那樣靜靜地躺著,像睡著了一般膝擂。 火紅的嫁衣襯著肌膚如雪虑啤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天架馋,我揣著相機(jī)與錄音狞山,去河邊找鬼。 笑死叉寂,一個(gè)胖子當(dāng)著我的面吹牛萍启,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屏鳍,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼勘纯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钓瞭?” 一聲冷哼從身側(cè)響起屡律,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎降淮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搏讶,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佳鳖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了媒惕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片系吩。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖妒蔚,靈堂內(nèi)的尸體忽然破棺而出穿挨,到底是詐尸還是另有隱情,我是刑警寧澤肴盏,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布科盛,位于F島的核電站,受9級特大地震影響菜皂,放射性物質(zhì)發(fā)生泄漏贞绵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一恍飘、第九天 我趴在偏房一處隱蔽的房頂上張望榨崩。 院中可真熱鬧谴垫,春花似錦、人聲如沸母蛛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彩郊。三九已至前弯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間焦辅,已是汗流浹背博杖。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筷登,地道東北人剃根。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像前方,于是被迫代替她去往敵國和親狈醉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

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