《劍指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的方格,先找出右上角的數字,如果右上角的數字是我們要找的數字就結束,...