二分法边界一直处理不好?试试防御式编程

二分法有三种模板,大佬总是能灵活运用,但这就苦了我们这些菜鸡。
个人的解决办法就是多判断一下边界,采取防御式编程,这样就只需要记一个模板就好了(雾

import java.util.*;


public class Solution {
    /**
     * 二分查找
     * @param n int整型 数组长度
     * @param v int整型 查找值
     * @param a int整型一维数组 有序数组
     * @return int整型
     */
    public int upper_bound_ (int n, int v, int[] a) {
        // write code here
        int left=0,right=n-1;
        while(left<=right){
            int mid=left+(right-left)/2;
            if(a[mid]<v){
                left=mid+1;
            }else if(a[mid]>=v){
                //如果数组中的第一个元素就大于目标值,那就直接加1返回
                if(mid==0) return mid+1;
                //判断一下是否为第一个大于等于的位置,利用了数组是有序的条件
                if(a[mid-1]>=v) {right=mid-1;}
                else return  mid+1;
            }
        }
        return n+1;
    }
}

总结下来就是,你只需要记住下面这个模板就好,在条件语句中多进行边界判断

int left=0,right=n-1;
while(left<=right){
    int mid=left+(right-left)/2;
    //if....
    //else...
}