二分搜索中的边界问题

版权声明:希望大家读懂代码,而不是复制粘贴提交 https://blog.csdn.net/pythonbanana/article/details/82529728

现在讨论二分搜索时的边界问题.
首先是第一个模板:

int binarySearch(int key){
    int left = 0,right = n;
    while(left < right){//这里是<,与下面的r = mid,l = mid+1,和数组从0->n-1
                        //还有l,r的初始值l = 0,r = n,这些是一一对应的 
        int mid = (right - left) / 2;
        if(A[mid] == key){
            return mid;
        }else if(key < A[mid]){
            right = mid;
        }else{
            left = mid + 1;
        }
    }
    return NOT_FOUND;
}

第二个模板是

int binarySearch(int key){
    int left = 1,right = n;
    while(left <= right){//这里是<=,与下面的r = mid - 1,l = mid+1,和数组从1->n
                        //还有l,r的初始值l = 1,r = n,这些是一一对应的 
        int mid = (right - left) / 2;
        if(A[mid] == key){
            return mid;
        }else if(key < A[mid]){
            right = mid + 1;
        }else{
            left = mid + 1;
        }
    }
    return NOT_FOUND;
}

lower_bound的实现:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 100;
int a[maxn];
int n = 0;
int solve(int x){
    int l = 1,r = n,mid = 0;
    int loc = 0;
    while(l <= r){//这里用<=与下面的r = mid-1,l = mid+1,和a[]数组下标从1->n是意义对应的 
        mid = (r - l)/2 + l;
        if(a[mid] == x){
            loc = mid;
            r = mid - 1;
        }else if(a[mid] < x){
            loc = mid;
            l = mid + 1;
        }else{
            r = mid - 1;
        }
    }
    //if(loc == 0){
    //  return a[mid] < x ? 
//      return l - 1;
//  }
    cout << "en " << l << " " << mid  << " " << r << endl;
    if(a[mid] == x){
        return loc;
    }else if(a[mid] < x){
        return l - 1;
    }else{
        return r + 1;
    }
//  return a[mid] <= x ? 
//  return loc;
}
int main(){
    while(cin >> n){
        for(int i = 1;i <= n;++i){//注意是从1->n 
            cin >> a[i];
        }
        sort(a + 1,a + n + 1);
        int key = 0;
        while(cin >> key){
            cout << solve(key)<< endl;  
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/pythonbanana/article/details/82529728