劍指offer 4 二維陣列中的查詢 題解

2021-10-06 06:02:36 字數 1356 閱讀 4127

在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。

選定乙個維度(行或列)先找到需要查詢的元素所在的行(列),再從該行(列)找到該元素的該元素具體的列(行)位置。複雜度為o(n)。

因為數列是遞增有序的,當找到需要查詢元素所在的行(列)再在該行(列)查詢該元素時,可以通過二分查詢進行優化。

思路為:選定列,先找到需要查詢元素所在的行,再在該行通過二分查詢方法找到該元素所在的具體位置,二分查詢使用while迴圈實現。

public boolean find

(int targetnum, int [

] array)

for(int i=array.length-

1;i>=

0;i--

) int arr[

]= array[i]

; int low =0;

int high = arr.length -1;

int middle =0;

if(targetnum< arr[low]

|| targetnum > arr[high]

)while

(low <= high)

else

if(arr[middle]

< targetnum)

else}}

return found;

}

首先選取陣列中右上角的數字。如果該數字等於要查詢的數字,則查詢過程結束;如果該數字大於要查詢的數字,則剔除這個數字所在的列;如果該數字小於要查詢的數字,則剔除這個數字所在的行。這樣每一步都可以縮小查詢範圍,直到找到要查詢的數字,或者查詢範圍為空。同樣我們也可以選取左下角的數字,回過頭來看我們上面的解法就是選取左下角的數字的解法。但我們不能選取左上角數字或者右下角數字,是無法縮小查詢範圍的。

public boolean find

(int targetnum, int [

] array)

//選取右上角數字進行判斷

int rows= array.length -1;

int columns= array[0]

.length -1;

if(rows >

0&& columns >0)

else

if(array[row]

[column]

> targetnum)

else}}

return

false

;}

[1] 《劍指offer(第二版)》 何海濤著

劍指offer4 二維陣列中查詢

在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列也都是按照從上到下遞增的順序排序。完成乙個函式,輸入乙個二維陣列和乙個整數,判斷該陣列中是否含有該整數。最開始的想法肯定就是暴力搜尋了,雙重for迴圈,但是這樣就和題目中給定的遞增的條件沒什麼關係了,顯然不是題目的本意。於是,採取另一種辦法...

劍指offer 4 二維陣列中查詢

乙個n m的二維陣列中,每一行都按照從左往右遞增的順序排序 每一列都按照從上到下遞增的順序排序。實現乙個函式 輸入乙個這樣的陣列和乙個整數,判斷這個陣列中有沒有這個整數 思路 方法一 暴力遍歷矩陣 matrix o n m 方法二 矩陣逆時針旋轉40 矩陣,得到二叉搜尋樹 根節點對應的是 7 3 這...

劍指offer 4 二維陣列中的查詢

在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。首先選取陣列中右上角的數字。如果該數字等於要查詢的數字,則查詢結束 如果該數字大於要查詢的數字,則剔除該數字所...