二分查詢:目標值的最小下標和目標值的最大下標
阿新 • • 發佈:2021-02-19
在目標值存在的條件下:
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){ while(l<=r){ int mid=(l+r)>>1; if(a[mid]>=target) r=mid-1; else l=mid+1; } return l; } int binarySearch_get_right(int a[],int l,int r,int target){ while(l<=r){ int mid=(l+r)>>1; if(a[mid]<=target) l=mid+1; else r=mid-1; } return r; } 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; }
執行的結果截圖: