二仙桥

二分法

lt+rt >> 2
while(lt < rt)
mid < v :: >= 第一个大于等于v
mid > v :: <= 第一个小于等于v
= mid + 1 OR
= mid

class Solution {
public:
    /**
     * 二分查找 待测试---
     * @param n int整型 数组长度
     * @param v int整型 查找值
     * @param a int整型vector 有序数组
     * @return int整型
     */
    int upper_bound_(int n, int v, vector<int>& a) {
        // write code here
        if(v<a[0]||v>a[n-1]){
            return n+1;
        }
        if(v==a[0]){
            return 1;
        }
        int beg=0,end=n,mid=n/2;
        while(beg!=end){
            mid=(beg+end)>>1;
            if(v<a[mid]){
                end=mid;
            }
            else if(v>a[mid]){
                beg=mid;
            }
            else 
                break;
        }
        while(v==a[mid]){
            mid--;
        }
        if(v==a[mid+1])
            return mid+2;
        else
            return n+1;
    }
};

原文地址:https://www.cnblogs.com/CSE-kun/p/14152068.html