二分查找模板

找到从左往右数第一个

#define ll long long
ll find_l(ll x, ll l, ll r) { ll mid
= 0; while (l < r)//最后会相等 { mid = l + (r - l) / 2;//向下取整,为什么不写成(l+r)/2,防止有时候会数据溢出 if (a[mid] >= x) r = mid; else l = mid + 1;//向下取整是左边要加1,不然会陷入死循环 } if (a[l] == x)//此处必须是a[l],因为如果为a[mid],mid少算一次 return l; else return -1; }

找到从右往左数第一个

ll find_r(ll x, ll l, ll r)
{
    ll mid = 0;
    while (l < r)
    {
        mid = l + (r - l) / 2 + 1;//向上取整
        if (a[mid] > x)
            r = mid - 1;//向上取整是右边要加1,不然会陷入死循环
        else
            l = mid;
    }
    if (a[l] == x)
        return l;
    else
        return -1;
}

 

posted @ 2020-04-24 17:03  鲜衣  阅读(69)  评论(0)    收藏  举报