找精確值模板
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?
- 區間變換思路是不斷的捨去不可能是解的區間,最後只剩下一個數就是我們的解。而第一種情況就算最後只剩一個數也有可能不是解,所以需要使用小於等於。