二分法尋找左右邊界

2021-10-05 06:37:09 字數 1186 閱讀 8441

尋找左邊界

(陣列有序,且有重複)

左閉右開

迴圈條件: 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 ...