《劍指Offer》面試題3 二維陣列中的查詢

2022-01-17 05:03:31 字數 1762 閱讀 2487

《劍指offer——名企面試官精講典型程式設計題》

一、書上原題再現

面試題3:二維陣列中的查詢

題目:在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。

請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。

二、涉及的知識點

三、解題過程

首先一看到陣列,就會下意識的想到遍歷,就是挨個比較,看看要查詢的數在不在裡面,遍歷雖然是萬能的,但是乙個乙個的比較,未免太過麻煩。不妨找找有沒有其他的方法,如果實在是找不到,最後再用遍歷的方法。

這道題比較特殊,特殊在數字是有序的,最小的數在左上角,最大的數在右下角,如下圖所示:

假如要查詢9是否在二維陣列內,我們可以選擇從右上角開始查詢,發現9>4,因為從左到右遞增,9都比4這一行最右邊的乙個數大了,所以這時候就可以忽略4左邊的所有數了,直接往下走進行比較(相當於刪掉一整行),發現9>8,同理,繼續往下(相當於刪掉一整行),發現9<12,說明9有可能在12的左邊,往左走進行比較,發現9<11,同理,繼續往左,發現9<10,繼續往左,發現9=9,返回結果為true,說明9在該二維陣列中。

如下圖所示:

對上面這段話的一開始有個疑問,為什麼要從右上角開始進行比較,能不能換個地方?

答案是:能。

發現右上角往左是遞減,往下是遞增。

相似左下角往右是遞增,往上是遞減。

所以左下角也可以當做入手點,能夠實現比較乙個數就刪掉一整行。

還有左上角和右下角,這兩個不能當做入手點,以左上角為例,最初數字1位於陣列的左上角,因為這個陣列是往右和往下兩個方向遞增的,我們要查詢9,那麼就無法做到刪掉一行,因為9既有可能在1的右邊,也有可能在1的下邊,右下角道理相似。

四、除錯步驟

使用myeclipse進行除錯

上圖為示意圖的**實現:

一、 先把flag設為false,預設不存在。

二、 預設陣列每行的列數都相等,所以可以

用rows=array.length來代表行數,

用columns=array[0].length來代表列數。

三、 row 和 column 來控制比較的切入點為右上角,

所以row=0,column=columns-1,減一是因為陣列下標索引從0開始而不是從1開始。

我的完整測試**:

五、總結

因為這道題的特殊性,所以有特殊解法的存在。與遍歷的方法相比,這樣一次刪掉一行或一列的方法顯然要快速的多。

六、宣告與致謝

本題源**請移步《劍指offer》作者何海濤的github:

參考文章:(每篇文章我都會去點讚

,好的文章就應該公諸於世,大家共同學習)

littlecurl的《二維陣列中的查詢》:

劍指offer 面試題3 二維陣列的查詢

題目 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。class solution else if array row col target col else row return ...

劍指offer面試題3 二維陣列查詢問題

在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。暴力破解方式也就是對二維陣列中的每個元素逐個檢查,結束條件為找到和目標值相等的元素或者查詢到最後乙個元素。對於乙個行列數都為n的二維陣...

劍指offer面試題 二維陣列的查詢

思路 當我們看到這道題的第一反應應該是遍歷這個二維陣列,逐個進行查詢,這樣雖然可以得到結果但是時間複雜度較大,並且沒有用到題目中給我們的線索,我們可以看到該二維數字是按照一定順序排列的。我們可以把這個四行四列的二維陣列看做乙個4 4的方格,先找出右上角的數字,如果右上角的數字是我們要找的數字就結束,...