今天看二分法看了一天,看吐了,现在讲讲怎么做类题。
只讲两种做法(实则是可合并为一种),任何题型都可以转化为这种做法!!!是任何!
首先,设置 int left,right ; //注意:这里的right永远不可达,也就是说最后的答案一定是落在left身上,而不是right身上,一定将right设置的大一点,一定!!!!!
1.
int l=x,=1e7+10; //这里的n是ans的最小值
while(l<r)
{
int mid=(l+r)/2;
if(a[mid] > ans ) //
{
r=mid;
}
else // a[mid] <= ans
{
l=mid;
}
if(l+1==r) break; //关键 关键 如果不加这一行,很有可能会出现死循环,因为前两步设置的是l=mid,(mid一定会落在l头上),这样l会一直小于r
}
return l;
2.
int left=0,right=n; //right依旧不可达,设的大一点
while(left<right)
{
int mid=(left+right)/2;
if(a[mid]>=x) right=mid;
else left=mid+1;
}
return right; //此时left=right
欢迎讨论!!!