二分查找和二分答案

  1. 二分查找(查找特定值)

    1. 定义查找区间的左右端点$l$和$r$,查找区间$[l,r]$.
    2. 当$l\leq r$时,计算中间值$mid=(l+r)/2=l+(r-l)/2$.
      1. 若$mid=k$,则找到答案
      2. 若$mid>k$,则设$r=mid-1$,继续搜索
      3. 若$mid<k$,则设$l=mid+1$,继续搜索
    3. 当$l>r$时,原区间$[l.r]$内不存在$k$。
    4. 模板代码:
    while (l <= r)
    {
        int mid = (l + r) / 2;
        if (a[mid] == b)
        {
            // 找到此数
            break;
        }
        if (a[mid] > b)
            r = mid - 1;
        else
            l = mid + 1;
    }
    
  2. 二分查找(查找第一个满足条件的位置)

    1. 初始赋值:$l$是一个不满足条件的位置,$r$是一个满足条件的位置。
    2. 当$l+1<r$,即$l$和$r$不相邻时,计算中间端点$mid=(l+r)/2=l+(r-l)/2$.
      1. 若$mid$满足条件,设$r=mid$,继续搜索
      2. 若$mid$不满足条件,设$l=mid$,继续搜索
    3. 当$l+1=r$时,$r$为第一个满足条件的位置。
    4. 模板代码
    while (l + 1 < r)
    {
        int mid = (l + r) / 2;
        if (a[mid] >= k)
            r = mid;
        else
            l = mid;
    }
    
  3. 二分答案

    1. 使用二分查找的思路,通过对if的条件加以修改,得到答案,即为二分查找。