如何优雅地写二分搜索

二分搜索大家都会,但是一般我们都是采用闭区间[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
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。