//判断条件是left+1<right 这样在left和right相隔1的时候循环就停止了,避免某些特殊情况造成死循环的问题。最后根据left和right展开讨论即可。

public int upper_bound_ (int n, int v, int[] a) {
        // write code here
        if(a.length==0) return 1;
        if(v>a[n-1]) return n+1;
        int left = 0;
        int right = n-1;
        while(left+1<right){
            int mid = (right-left)/2+left;
            if(a[mid]>=v){//中值大于等于目标值 中值也有可能是答案 因此right=mid
                right=mid;
            }else left = mid+1;
        }
        if(a[left]>=v) return left+1;
        else if(v<=a[right]) return right+1;
        else return n+1;
    }