如何优雅地写二分搜索

二分搜索大家都会,但是一般我们都是采用闭区间[a,b]的方式来进行搜索,并且循环条件一般是left <= right。但是这种方式需要考虑的边界条件比较多,这里推荐二分搜索最好采用半开区间[a,b)判断的方式,也就是说如果数组大小为n,那初始的left设为0,right设为n。以下代码足够简洁,并且可以返回第一个大于等于target的数的index:

private int binarySearch(int[] arr, int target) {
        int left = 0, right = arr.length;    // 注意这个初始right设为数组长度
        while (left < right) {
            // 推荐采用这种方式取mid,而不是 mid = (left + right) / 2,因为后者可能会导致溢出
            int mid = left + (right - left)/2; 
            if (arr[mid] < target)
                left = mid+1;
            else right = mid;
        }
        return left;  // 这里不需要考虑返回left还是right,因为最终left总是等于right
    }

你可能感兴趣的:(如何优雅地写二分搜索)