面試題04. 二維數(shù)組中的查找

題目

在一個 n * m 的二維數(shù)組中款侵,每一行都按照從左到右遞增的順序排序躏结,每一列都按照從上到下遞增的順序排序潜的。請完成一個函數(shù),輸入這樣的一個二維數(shù)組和一個整數(shù)永部,判斷數(shù)組中是否含有該整數(shù)独泞。

示例:

現(xiàn)有矩陣 matrix 如下:

[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]

給定 target = 5,返回 true苔埋。

給定 target = 20懦砂,返回 false。

限制:

0 <= n <= 1000

0 <= m <= 1000

注意:本題與主站 240 題相同:https://leetcode-cn.com/problems/search-a-2d-matrix-ii/

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有组橄。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán)荞膘,非商業(yè)轉(zhuǎn)載請注明出處。

解法

動態(tài)規(guī)劃

最容易想到的就是動態(tài)規(guī)劃玉工。

class Solution:
    def __init__(self):
        self.ans = False    # 類似全局變量

    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        # 怎么想也是一個動態(tài)規(guī)劃的題目
        if len(matrix) == 0 or len(matrix[0]) == 0:
            return False
        self.naive_walk(matrix,target,0,0)
        return self.ans
    # 超時
    def naive_walk(self, matrix,target,i,j):
        if i>=len(matrix) or j >=len(matrix[0]):
            return
        if self.ans == True:
            return 
        n = matrix[i][j]
        if target == n:
            self.ans = True
            return 
        if n > target:
            return     
        self.naive_walk(matrix,target,i,j+1)
        self.naive_walk(matrix,target,i+1,j)

然而這個超時了羽资,主要的問題是復(fù)雜度為m*n.

從右上角開始

要充分利用數(shù)組的順序,每一行都按照從左到右遞增的順序排序遵班,每一列都按照從上到下遞增的順序排序屠升。
從左上角開始選擇的話潮改,需要回溯很多次。但是從右上角開始的話腹暖,如果當前值比較小的話汇在,就往下,當前值比較大的話微服,就往左趾疚。甚至不需要回溯就能完成。

遞歸版本和非遞歸版本:

class Solution:
    def __init__(self):
        self.ans = False

    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        # 怎么想也是一個動態(tài)規(guī)劃的題目
        if len(matrix) == 0 or len(matrix[0]) == 0:
            return False
        self.walk_right(matrix,target,0,len(matrix[0])-1)
        # self.ans = self.easy_walk(matrix,target)
        return self.ans

    

    def walk_right(self, matrix,target, i, j):
        if i >= len(matrix) or j < 0:
            return
        #print(i,j)
        num = matrix[i][j]
        if num == target:
            self.ans = True
            return 
        if num < target:
            self.walk_right(matrix,target,i+1,j)
        else:
            self.walk_right(matrix,target,i,j-1)

    def easy_walk(self, matrix,target):
        if matrix is None or len(matrix) == 0 or len(matrix[0]) == 0:
            return False
        i = 0
        j = len(matrix[0])-1
        while i<len(matrix) and j >=0 :
            num = matrix[i][j]
            if num == target:
                return True
            if num > target:
                j -= 1
            if num < target:
                i += 1
        return False
 

總結(jié)

這一題主要是想到了從右上角開始的思路就好了以蕴。
** 踩過的坑 **
如果寫成這樣:

if  matrix[i][j] > target: j -= 1
if  matrix[i][j] < target: i += 1
if  matrix[i][j] == target: return True 

這樣在i+1或者j-1的時候已經(jīng)越界了糙麦,還去取值會出錯!
同時丛肮,有時候i j 已經(jīng)偏移了赡磅,這時候取得的 matrix[i][j] 不是當前要判斷的值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宝与,一起剝皮案震驚了整個濱河市焚廊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌习劫,老刑警劉巖咆瘟,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诽里,居然都是意外死亡袒餐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門谤狡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灸眼,“玉大人,你說我怎么就攤上這事墓懂⊙嫘” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵捕仔,是天一觀的道長匕积。 經(jīng)常有香客問我,道長榜跌,這世上最難降的妖魔是什么闸天? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮斜做,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘湾揽。我一直安慰自己瓤逼,他們只是感情好笼吟,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霸旗,像睡著了一般贷帮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诱告,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天撵枢,我揣著相機與錄音,去河邊找鬼精居。 笑死锄禽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的靴姿。 我是一名探鬼主播沃但,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼佛吓!你這毒婦竟也來了宵晚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤维雇,失蹤者是張志新(化名)和其女友劉穎淤刃,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吱型,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡逸贾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了唁影。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耕陷。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖据沈,靈堂內(nèi)的尸體忽然破棺而出哟沫,到底是詐尸還是另有隱情,我是刑警寧澤锌介,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布嗜诀,位于F島的核電站,受9級特大地震影響孔祸,放射性物質(zhì)發(fā)生泄漏隆敢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一崔慧、第九天 我趴在偏房一處隱蔽的房頂上張望拂蝎。 院中可真熱鬧,春花似錦惶室、人聲如沸温自。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悼泌。三九已至松捉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間馆里,已是汗流浹背隘世。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鸠踪,地道東北人丙者。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像慢哈,于是被迫代替她去往敵國和親蔓钟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

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