二分(两个版本)第一个是可以找到第一个等于x的元素,第二个是可以找到最后一个等于x的元素
但不局限于此第一个可以看作找到某个条件的最左端,第二个就是最右端
#### C++ 代码
void find(int x)
{int l=0;
int r=N;
while(l<r)
{
int mid=r+l>>1;
if(a[mid]>=x)r=mid;
else l=mid+1;
}
}
void find (int x)
{
int l=0;
int r=N;
while(l<r)
{
int mid=r+l+1>>1;
if(a[mid]<=x)l=mid;
else r=mid-1;
}
}
//对于这两个模板,第一个在小的成立,大的一定成立的情况下用第二个则反之;
//至于为什么如果某端未能判断就结束那就可能对结果有影响
//第一个模板右端可能查不到;而第二个模板则是左端可能查不到(具体例题看139.回文子串的最大长度,这题用第一个模板是无法通过的)
while(l<r)
{
int mid=l+r>>1;
if(check(mid)r=mid;
else l=mid+1;
}
while(l<r)
{
int mid=l+r+1>>1;
if(check(mid)r=mid-1;
else l=mid;
}
```