在目标值存在的条件下:
1.我们使用的退出循环的条件为l<=r
2.找到目标值的最小下标,将大于和等于合并成为一种情况:a[mid]>=target,答案的下标存在与l (如果只有一个target值的话,l存的就是唯一target值的下标)
3.找到目标值的最大下标,将小于和等于合并成为一种情况:a[mid]<=target,答案的下标存在与r (如果只有一个target值的话,r存的就是唯一target值的下标)
在目标值不存在的条件下:
binarySearch_get_left 和 binarySearch_get_right 下标l和r的含义:
1.下标l为比target大的最小下标值
2.下标r为比target小的最大下标值
3.要注意的点就是l,r是有可能越界的
value: 1 1 2 2 4 4
index: 0 1 2 3 4 5
target=3
两个二分查找得到的l=4,r=3(r,l对应的都是下标)
具体看代码实现:
#include <iostream>
#include<stdio.h>
using namespace std;
int binarySearch_get_left(int a[],int l,int r,int target){
int right=r;
while(l<=r){
int mid=(l+r)>>1;
if(a[mid]>=target) r=mid-1;
else l=mid+1;
}
if(l<=right&&a[l]==target)
return l;
else return -1;
}
int binarySearch_get_right(int a[],int l,int r,int target){
int left=l;
while(l<=r){
int mid=(l+r)>>1;
if(a[mid]<=target) l=mid+1;
else r=mid-1;
}
if(r>=left&&a[r]==target)
return r;
else return -1;
}
int main() {
int b[]={0,0,1,1,2,2,3,3};
for(int i=0;i<4;i++){
printf("target: %d,get_left index: %d,get_right index: %d\n",i,binarySearch_get_left(b,0,7,i),binarySearch_get_right(b,0,7,i));
}
return 0;
}
运行的结果截图: