二分法的思想很容易理解,但是細節處理卻是乙個難點。很容易就容易出錯。這裡總結一下這些細節。區間為 [left, right)情況(右邊指標取不到元素):
* 初始化: left = 0;right = arr.length;
* 迴圈條件:left < right
* 注意事項:
* left 的更新是取到值的情況
* right的更新是不取到值的情況
區間為 [left, right]情況(左右指標都可以取到元素):* 初始化: left = 0;right = arr.length - 1;
* 迴圈條件:left <= right
* 注意事項:
* left 的更新是取到值的情況
* right的更新是也是取到值的情況
二分查詢元素法:package binarysearch;
public
class
searchvalue
;for
(int num : arr )
}/**
* 二分查詢,是否存在num,存在返回下標,不存在返回-1
* @param arr
* @param num
* @return
*/public
static
intsearchindex1
(int
arr,
int num)
else
if(arr[mid]
< num)
}return-1
;}public
static
intsearchindex2
(int
arr,
int num)
else
if(arr[mid]
< num)
}return-1
;}}
尋找左側的邊界:package binarysearch;
public
class
searchthelefttarget
;for
(int num : arr )
}/**
* 找出小於val值的個數,即 **第乙個大於或等於val值的下標**
* @param arr
* @param val
* @return
*/public
static
intsearchcount
(int
arr,
int val)
else
if( arr[mid]
< val)
}//迴圈跳出條件是left == right,最終返回哪個都行
return left;
}}
尋找右側的邊界:package binarysearch;
public
class
searchtherighttarget
;for
(int num : arr )
}/**
* 找出 第乙個小於或等於val值的下標
* @param arr
* @param val
* @return
*/public
static
intsearchcount
(int
arr,
int val)
else
if(arr[mid]
> val)
}return left -1;
}}
分析⼆分查詢**時,不要出現 else,全部展開成 else if ⽅便理解。
注意「搜尋區間」和 while 的終⽌條件,如果存在漏掉的元素,記得在最後檢查。
如需要搜尋左右邊界,只要在 nums[mid] == target 時做修改即可,搜尋右側時需要減⼀。若target在nums陣列中不存在,我們可以假設target存在,則搜尋左邊時,return的是假設的target位置右邊的值,即稍微比target大一點的值,若搜尋的是右邊時,return的事假設的target位置左邊的值,即稍微比target小一點的值。
二分法細節
int binarysearch int nums,int target else if nums mid target else if nums mid target return 分析二分查詢的乙個技巧是 不要出現 else,而是把所有情況用 else if 寫清楚,這樣可以清楚地展現所有細節。...
二分法 總結
1 二分查詢 binarysearch 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 線性表是有序表,即表中結點按關鍵字有序,並且要用向量作為表的儲存結構。不妨設有序表是遞增有序的。2 二分查詢的基本思想 二分查詢的基本思想是 設r low,high 是當前的查詢區間 1 首先確定...
二分法小總結
主要分為兩種 區間按序列劃分和區間按值劃分 區間按序列劃分 這種比較常見,一般是針對有序陣列或者部分有序陣列 如旋轉有序陣列 m是序列的中點,不斷的縮小區間。33 81 153 154 69 162 4 74 區間按值劃分 主要是無序陣列會使用,m取可能結果的最小值和最大值的中值,所以就是不停的猜m...