【算法】【二分】二分查找總結

找精確值模板

int l = 0, r = n - 1;
while(l <= r)
{
    int mid = l + r >> 1;
    if(arr[mid] < target) l = mid + 1;
    else if(arr[mid] > target) r = mid - 1;
    else return mid;
}
return -1;


[l, r]劃分成[l, mid]和[mid + 1, r]

int l = 0, r = n - 1;
while(l < r)
{
	int mid = l + r >> 1;
	if(check(mid)) r = mid;
    else l = mid + 1;
}
return l;

[l, r]劃分成[l, mid - 1]和[mid, r]

int l = 0, r = n - 1;
while(l < r)
{
	int mid = l + r + 1>> 1;
	if(check(mid)) l = mid;
    else r = mid - 1;
}
return l;

說明

循環的判斷條件l <= r?

  • 區間變換思路是不斷的捨去不可能是解的區間,最後只剩下一個數就是我們的解。而第一種情況就算最後只剩一個數也有可能不是解,所以需要使用小於等於。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章