二分查找

二分查找及其变体问题

无重复元素查找

/**
 * 二分查找
 * 
 * @param arr   无重复元素的有序数组(升序)
 * @param value 待查找目标值
 * @return 符合条件的元素下标,否则返回-1
 */
public static int binarySearch(int[] arr, int value) {
    if (arr == null || arr.length == 0) {
        return -1;
    }
    int start = 0;
    int end = arr.length - 1;
    while (start <= end) {
        // 如果使用 (start+end)/2 在start 和 end 较大时有溢出风险
        int middle = start + ((end - start) >> 1);
        if (arr[middle] == value) {
            return middle;
        } else if (arr[middle] > value) {
            end = middle - 1;
        } else {
            start = middle + 1;
        }
    }
    return -1;
}

寻找第一个等于指定值的元素

寻找最后一个等于指定值的元素

第一个大于等于指定值的元素

针对升序数组。

最后一个小于等于指定值的元素

针对升序数组。

最后更新于