二分搜索法
对于while有两种写法易混淆
while(left<right)
while(left<=right)
对于if里面的步骤也有易混淆的步骤
if(nums[middle]>target)
left=middle;
left=middle-1;
我们对于二分的基本的区间主要有
[left,rifht] 左闭右闭
[left,right)左闭右开
不断的在区间中进行搜索,区间相当于一个不变量,while就要坚持不变量的原则
也就是说一开始如果是大区间就是左闭右闭的话,以后我们每次搜索的区间就要得是左闭右闭的,不可以任意改动
对于左闭右闭区间
left=0;
right=size-1;
while(left<=right)//首先进入while的区间必须要合法,【1,1】是合法的 【1,1)不是合法的
{
int middle=(right+left)>>1;
//在这里的话.有时如果right和left都比较大的话,就可能会越界,所以改成left+(right-left)>>1;比较好
if(nums[middle]>target)
right=middle-1;
else if(nums[middle]<targrt)
left=middle+1;
else return middle;
}
return -1;
对于左闭右开区间 中间的if else 语句中的操作是为了保证每次搜索的区间定义是一致的
left=0;
right=size;
while(left<right) //[1,2)才是合法的
{
int mid=(left+right)>>1;
if(nums[mid]>target)
right=mid;
else if(nums[mid]<target)
left=mid+1;
else return mid;
}
return -1;
原创文章,作者:端木书台,如若转载,请注明出处:https://blog.ytso.com/268167.html