二分总结
二分总结
标签: 二分
情况1,找到第一个大于q的节点(找到最后一个小于等于q的位置-1)
手写代码:左指针始终指向小于等于q的节点,右指针是种指向大于q的节点,结束条件是l和r相邻。最后返回r
int solve(int q, int n)
{
int l = 0, r = n-1;
int mid;
while(r-l>1)
{
mid = (l+r)/2;
if(mp[mid]<=q) l = mid;
else {
r = mid;
}
}
return r;
}
std中调用的函数为
upper_bound(mp,mp+n,q)-mp;
最后一定要减去开始位置。因为返回的是指针。
情况2,找到第一个大于等于q的节点(找到最后一个小于q的位置+1)
手写代码:考虑第一个大于等于q的节点,那么有l始终指向小于它的位置,r始终指向大于等于它的位置
int solve(int q, int n)
{
int l = 0;
int r =n-1;
int mid;
while(r-l>1){
mid = (l+r)/2;
if(mp[mid]<q) l = mid;
else r = mid;
}
return r;
}
也可以直接调用函数
lower_bound(mp,mp+n,q)-mp;
情况3,找第一个等于的,用第二个方法得出的结果判断。