在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
選定乙個維度(行或列)先找到需要查詢的元素所在的行(列),再從該行(列)找到該元素的該元素具體的列(行)位置。複雜度為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 二維陣列中的查詢
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。首先選取陣列中右上角的數字。如果該數字等於要查詢的數字,則查詢結束 如果該數字大於要查詢的數字,則剔除該數字所...