二分查找的条件判断
如果1 2 3 4 4 5 6 7
(个人理解)
我们如果想找到大于4的最小的那个数,即num[mid] >= 4都得满足条件才行
同理找小于4的最后一个数就是num[mid] < 4,使得num[mid]所有的数都得满足小于4这个条件才行
所以根据这个理解就很好来写二分中num[mid]与target之间的关系了
对个人而言,如果要找小于target的最后一个数,就直接套用y总的算法模板,然后再括号里面的判断为num[mid] < target
如果是小于等于target的最后一个数,就直接改成num[mid] <= target
然后紧邻着都是L = X或者R = X,不用+1,我一般直接这么记规律然后去写很好记hhh
其他注意的地方跟y总那个模板差不多,就是当l = mid的时候,mid = l + r + 1 >> 1,这个地方要加上1
如果觉得有用的话记得点个赞hhhh
代码如下
int main()
{
int num[9] = {1,2,3,3,4,4,5,5,7};//测试数据
int L = 0,R = 8;
int target = 5;
//求小于等于target的最后一个数的下标
while(L < R)
{
int mid = L + R + 1 >> 1;
if(num[mid] <= target) L = mid;
else R = mid - 1;
}
//求大于等于target的第一个数的下标
while(L < R)
{
int mid = L + R >> 1;
if(num[mid] >= target) R = mid ;
else L = mid + 1;
}
//小于target的最后一个数的下标
while(L < R)
{
int mid = L + R + 1 >> 1;
if(num[mid] < target) L = mid ;
else R = mid-1;
}
//大于target的第一个数的下标
while(L < R)
{
int mid = L + R >> 1;
if(num[mid] > target) R = mid;
else L = mid + 1;
}
cout<<L;
return 0;
}