尋找左邊界
(陣列有序,且有重複)
左閉右開
迴圈條件: left < right
中間位置計算: mid = left + ((right -left) >> 1)
左邊界更新:left = mid + 1
右邊界更新: right = mid
返回值: nums[left] == target ? left : -1
public
static
void
main
(string[
] args)
;int target=8;
int mid=-1
;//查詢左區間
int left=
0,right=nums.length-1;
while
(leftelse
if(nums[mid]
else
if(nums[mid]
>target)}if
(nums[left]
==target)
else
}
尋找右邊界
(陣列有序,且有重複)
左閉右開
迴圈條件: left < right
中間位置計算: mid = left + ((right -left) >> 1) + 1
左邊界更新:left = mid
右邊界更新: right = mid - 1
返回值: nums[right] == target ? right : -1
public
static
void
main
(string[
] args)
;int target=8;
int mid=-1
;//查詢左區間
int left=
0,right=nums.length-1;
while
(leftelse
if(nums[mid]
else
if(nums[mid]
>target)}if
(nums[right]
==target)
else
}
左右邊界二分查詢
二分查詢雖然是個基礎演算法,但是要考慮的還是蠻多的 二分的前提是避免死迴圈,所以邊界迭代的時候不能出現重複的值,由於整數型別的除法是向下取整,所以當left right 1的是時候就會造成mid left如果邊界迭代是left mid的話 就會陷入死迴圈,所以邊界迭代最好寫成下面的形式,再根據不同的...
二分法的邊界選擇
要在有序陣列中找某個數,這個數隻出現一次 這個寫法有三個點需要注意 int find int x,int a,int begin,int end else if a m x else return 1 intmain cout find 0 a,0,9 endl cout find 5 a,0,9 ...
尋找假幣問題(二分法)
有n個硬幣,編號為1 n,其中有乙個假幣,且假幣較輕,如何採用天平稱重方式找到這個假幣?可採用如下的分治演算法解決這個問題 如果n為偶數,則將這n個硬幣分成兩等份,並將兩份硬幣放到天平兩端,假幣在較輕的那端 2,如果n為奇數,則取出第1個硬幣後將其餘硬幣分成兩等份,並將兩份硬幣放到天平兩端 2.1 ...