本文最后更新于-1天前,其中的信息可能已经过时,如有错误请发送邮件到2392862431@qq.com

- 寻找左边的端点 mid=(l+r+1)/2;(为何l+r+1,因为边界点的问题,不加会有死循环的问题)if(check(mid))—————>true: l=mid,[mid,r] false: r=mid-1,[l,mid-1];
- 寻找右边的端点 mid=(l+r)/2;if(check(mid))————–>true: r=mid,[l,mid] false: l=mid+1,[mid+1,r];
思想:双指针算法。
二分一定可以得出一个最终结果,但是不代表题目一定有符合条件的解,只是二分找到了一个符合或者最接近题目所需的答案。
思路:
1、确定边界点.
2、确定check条件。
3、根据true和false分别更新区间
4、检查二分结果是否符合题目的要求。
第一种模板:
寻找左侧的端点:
while(l<r)
{
int mid=(l+r)/2; //确定边界值
if(a[mid]>=x)
{
r=mid;
}
else
{
l=mid+1;
}
}
第二种模板:
寻找右侧端点:
while(l<r)
{
int mid=(l+r)/2;
if(a[mid]<=x)
{
l=mid;
}
else
{
r=mid-1;
}
}
总结: 能用单调性写的题目一定能用二分来写,但反过来不行,二分解题一般给的序列是有序的,一般分为左右两区域,一部分符合条件,一部分不符合。









