1. 程式人生 > 其它 >二分查詢:目標值的最小下標和目標值的最大下標

二分查詢:目標值的最小下標和目標值的最大下標

技術標籤:資料結構c++資料結構

在目標值存在的條件下:

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;
}

執行的結果截圖: