二分查找 - 闭着眼睛都能写对的二分模板

二分查找 - 终结篇

一、寻找一个数(基本的二分搜索)

int binarySearch(int[] nums, int target) {
    int left = 0; 
    int right = nums.length - 1; // [left, right]

    while(left <= right) {  // 找终止条件 => left = right + 1 => [right +1, right]
        int mid = left + (right - left) / 2;
        if(nums[mid] == target)
            return mid; 
        else if (nums[mid] < target) // 左边的数往右走, 闭区间 => 不能取mid(因为已经比过了) => left = mid + 1;
            left = mid + 1; 
        else if (nums[mid] > target) // 同理
            right = mid - 1;
    }
    return -1;
}

注 : 基本上就这四个地方就可以写出所有的二分搜索了~

二、寻找左侧边界的二分搜索

int left_bound(int[] nums, int target) {
    if (nums.length == 0) return -1;
    int left = 0;
    int right = nums.length; // ① [left, right)

    while (left < right) { // ② 找终止条件 => left = right => [right, right)
        int mid = (left + right) / 2;
        if (nums[mid] == target) { // 找左区间, 就把右区间给移过来, 然后不断的缩小左区间
            right = mid;
        } else if (nums[mid] < target) { // 看①, 闭区间, 取mid +1
            left = mid + 1;
        } else if (nums[mid] > target) { // 看①, 开区间, 取mid
            right = mid; // 注意
        }
    }
    return left; // 注意 左区间不特殊, 看判断语句的 target = mid = right = mid
}

三、寻找右侧边界的二分查找

int right_bound(int[] nums, int target) {
    if (nums.length == 0) return -1;
    int left = 0, right = nums.length; // ① [left, right)

    while (left < right) { // ② 找终止条件 => left = right => [right, right)
        int mid = (left + right) / 2;
        if (nums[mid] == target) { // 找右区间, 就把左区间给移过来, 然后不断的缩小右区间
            left = mid + 1; 
        } else if (nums[mid] < target) { // 看1, 闭区间, 取mid + 1
            left = mid + 1;
        } else if (nums[mid] > target) { // 看1, 开区间, 取mid
            right = mid;
        }
    }
    return left - 1; // 注意 右区间有一点特殊 看判断语句的target = mid = left -1 = right -1 , 都可以, 跟左区间一样
}

感谢:

我作了首诗,保你闭着眼睛也能写对二分查找

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值