二分查找的总结

 二分搜索法
对于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;

posted on 2022-06-18 01:28  不是小朋友L  阅读(41)  评论(0)    收藏  举报

导航