提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
关于二分查找的一些问题
只要是while l<=r 进行l = mid+1 r = mid-1
总会出现l>r反向结束循环
有重复元素找值的位置(若重复,输出第一个)
//找小
int ans=-1;
while(l<=r)
{
mid = (l+r)/2;
if(a[mid]<target)l = mid+1;
else{
r = mid-1;
ans = mid;
}
}
//若要返回重复的最后一个,只需要把l = mid+1放在else并顺便存答案即可
/*
if(a[mid]>target)
{
r = mid-1;
}
else{
l = mid+1;
ans = mid;
}
*/
有重复元素返回第一个比他小的/大的
//找小
int ans=-1;
while(l<=r)
{
mid = (l+r)/2;
if(a[mid]<target){
l = mid+1;
ans = a[mid];//这时存答案因为a[mid]已经比它小了,可能是答案
}
else r = mid-1;//相等时也要往左边找
}
//如果全部比他大,则ans赋值语句不会进行 ans为初值-1
//找大
int ans=-1;
while(l<=r)
{
mid = (l+r)/2;
if(a[mid]<target){
l = mid+1;
ans = a[mid];
}
else r = mid-1;
}
总结
在有重复元素时二分,只需要考虑相等放在else一并处理,并且提前存储答案即可