二分查找

1. 标准的二分查找

即从两边一步一步的向中间靠拢,查找指定的某一个值

public boolean binarySearch(int[] nums, int target) {
    int start = 0, end = nums.length - 1;

    while(start <=  end){
        int mid = (start + end) / 2;

        if(nums[mid] == target){
            return true;
        } else if(nums[mid] < target){
            start = mid + 1;
        } else {
            end = mid - 1;
        }
    }

    return false;
}

2. 查找小于等于指定值的最大值,大于等于指定值的最小值

小于等于指定值的最大值

public int binarySearch(int[] nums, int target) {
    int start = 0, end = nums.length - 1;

    while(start <  end){
        int mid = (start + end + 1) / 2;

        if(nums[mid] > target){
            end = mid - 1;
        } else {
            start = mid;
        }
    }

    if(nums[start] > target){
        return -1;
    }
    return start;
}

注意:

  1. 为什么 start < end,并且 mid = (start + end + 1) / 2;
. . . . . . 3 6 . . .
. . . . . . k k + 1 . . .

假设查询小于等于 5 的最大值,此时 start = k,end = k + 1;若 mid = (start + end)/ 2;则程序陷入死循环,改成 mid = (start + end + 1) / 2;则可以取到索引较大的那一项。

当 start 等于 end 的时候,即为可能的答案。

  1. 若无解,则循环结束之后 start 仍未发生改变。

大于等于指定值的最小值

public int binarySearch(int[] nums, int target) {
    int start = 0, end = nums.length - 1;

    while(start <  end){
        int mid = (start + end) / 2;

        if(nums[mid] < target){
            start = mid + 1;
        } else {
            end = mid;
        }
    }

    if(nums[end] < target){
        return -1;
    }
    return start;
}

分析同上,计算中值的时候同样避免了死循环。

posted @ 2019-08-21 19:35  telankesi  阅读(137)  评论(0编辑  收藏  举报