二分算法思想
我們目標區間定爲[l, r], 每次縮小一半的空間,知道l = r時我們就找到目標值
整數二分
版本1
當我們把區間劃分爲[l, mid]和[mid + 1, r]時,即我們每次令r = mid或l = mid + 1;
算法模板
int bsearch_1(int l, int r)
{
while(l < r)
{
int mid = (l + r) >> 1; //相當於(l + r) / 2
if(check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
版本2
當我們把區間劃分爲[l, mid-1]和[mid, l]時,即我們每次令r = mid-1或者l = mid;
算法模板
int bsearch_1(int l, int r)
{
while(l < r)
{
int mid = (l + r + 1) >> 1; //此處+1爲了防止死循環,
if(check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
注意以上爲整數的二分需要特別注意防止死循環
簡便記法,當mid賦值給r時不需要+1,當mid賦值給l時需要+1;
浮點數二分
bool check(double x) {/* ... */} // 檢查x是否滿足某種性質
double bsearch_3(double l, double r)
{
const double eps = 1e-6; // eps 表示精度,取決於題目對精度的要求
while (r - l > eps)
{
double mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid;
}
return l;
}
文章參考:https://www.acwing.com/blog/content/31/
個人學習使用