首页 > 其他 > 详细

二分查找

时间:2019-08-21 21:10:24      阅读:93      评论:0      收藏:0      [点我收藏+]

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;
}

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

二分查找

原文:https://www.cnblogs.com/zcxhaha/p/11390740.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!