在乙個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
比如給定以下陣列[[
2.1 暴力法
最直接的就是暴力法,兩次for迴圈,遍歷那個二維陣列,如果array[i][j] == target,那麼返回就是true,否則返回的就是false
2.2 暴力二分法
這個也類似於暴力法,相當於把暴力法的第二次for迴圈進行改造,因為是有序的。所以第二次for迴圈的時候採用折半去搜尋
2.3 右上角搜尋
之所以選擇右上角的話,是因為從最左上角(起始位置)到最右上角,再從最右上角到最右下角,是一段逐漸遞增的過程,所以右上角適合作為搜尋的位置,同理,左下角也是一段連續的,也可以作為搜尋的位置。
這裡的話,大致的過程就是: 先拿最右上角的值和目標值(target)進行比較,如果最右上角的值比目標值大,那麼肯定在右上角那一列的,然後 列- -;如果最右上角的值比目標值小的話,那麼肯定在右上角的那一行的下面,就要進行 行++。
2.4 左下角搜尋
同2.3的思路
//暴力法
public
static
boolean
solution3
(int
array,
int target)
for(
int i =
0; i < array.length; i++)}
}return
false
;}
3.2 暴力二分法//暴力二分法
public
static
boolean
solution2
(int
array,
int target)
for(
int i =
0; i < array.length; i++
)else
if(target < array[i]
[mid]
)else}}
return
false
;}
3.3 右上角//從右上角查詢
public
static
boolean
solution1
(int
array,
int target)
//總行數
int rows = array.length;
//總列數
int cols = array[0]
.length;
int row =0;
int col = array[0]
.length -1;
while
(row < rows && col >=0)
else
if(array[row]
[col]
> target)
else
}return
false
;}
3.4 左下角//左下角開始
public
static
boolean
solution4
(int
array,
int target)
int rows = array.length;
int cols = array[0]
.length;
int row = rows -1;
int col =0;
while
(row >=
0&& col < cols)
else
if(array[row]
[col]
< target)
else
}return
false
;}
3.5 測試**public
static
void
main
(string[
] args),,
,}; system.out.
println
(solution4
(array,11));}
劍指offer 01 二維陣列的查詢
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。由題意知,陣列是有序的,既然有序就可以不用雙重迴圈找值 考慮中間值,即若大於往 找,若小於則往 找 得出最左下...
劍指Offer01之二維陣列中查詢目標數
在乙個二維陣列中 每個一維陣列的長度相等 每一行都是從左到右遞增的順序排序,每一列都是從上到下遞增的順序排序,輸入這樣乙個二維陣列和乙個整數,判斷該整數是否在二維陣列中。暴力查詢法,通過遍歷整個二維陣列進行判斷 public static boolean violence int arr,int t...
劍指offer 01二維陣列中的查詢
二叉排序樹的定義 二叉排序樹,又稱為二叉查詢樹。它或者是一顆空樹,或者具有下列性質的二叉樹。若它的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值 若它的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值 它的左 右子樹也分別為二叉排序樹。這種樹模式下的搜尋途徑可以遍歷或預判所有可能性 比...