Binary Search
二分查找
在闭区间查找[begin,end],注意对找不到的处理
int binary_find(vector<int>& nums, int target){
    int l=0,r=nums.size()-1;//Notice
    while(l<r){
        int mid=l+(r-l)>>1;
        if(nums[mid]==target)return mid;
        else if(nums[mid]>target)r=mid-1;
        else l=mid+1;
    }
    return nums[l]==target?l:-1;
}
二分搜索
- 在[begin,end)查找,故格外注意边界
 - 满足条件时右不变,不满足时左加一
 - 注意变式如求上界(注释部分)
 
int upper_bound(vector<int>& nums, int target){
    int l=0,n=nums.size();//Notice
    int r=n;
    while(l<r){
        int mid=l+(r-l)>>1;
        if(nums[mid]>target)r=mid;
        else l=mid+1;
    }
    if(r==n)return -1;
    if(nums[l]!=target)return -1;
    else return l;
    /*
    if(l==0)return -1;
    if(nums[l-1]!=target)return -1;
    else return l-1;    
    */
}
int lower_bound(vector<int>& nums, int target){
    int l=0,n=nums.size();//Notice
    int r=n;
    while(l<r){
        int mid=l+(r-l)>>1;
        if(nums[mid]>=target)r=mid;
        else l=mid+1;
    }
    if(r==n)return -1;
    if(nums[l]!=target)return -1;
    else return l;
}

                
            
        
浙公网安备 33010602011771号