二分法总结

本文探讨了如何判断和实施二分查找,提供了一个通用的二分搜索框架,并强调了注意事项,如防止溢出和更新边界。通过两道实例题目——珂珂吃香蕉和运输问题,展示了二分法在解决实际问题中的应用,强调了在判断可行性时需单独设计辅助函数的重要性。
摘要由CSDN通过智能技术生成

最近又开始刷题了,定期总结一下,主要还是跟着labuladong进行二分法的刷题

1.如何判别是不是可以用二分法?

1)有序数组中搜索给定某个目标值的索引。

2)搜索空间有序时,可以通过二分搜索剪枝

2.二分搜索的框架

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

    while(...) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            ...
        } else if (nums[mid] < target) {
            left = ...
        } else if (nums[mid] > target) {
            right = ...
        }
    }
    return ...;
}

3.二分搜索需要注意的细节

1)不要写else,尽量写else if,写出条件会比较清楚

2)计算 mid 时需要防止溢出,代码中 left + (right - left) / 2 就和 (left + right) / 2 的结果相同,但是有效防止了 leftright 太大直接相加导致溢出。

3)while条件里面写小于等于还是小于,注意判断,不要溢出。和right的大小等于length或者length-1有关。

4)left,right是怎么变化的,如何更新的,一般是left = mid, right=mid+1

3.二分搜索的题目

1)珂珂吃香蕉

把问题拆解,找到最大吃香蕉速度(max(arr)),最小吃香蕉速度=1,然后判断max和min是不是可行的,然后在计算mid逐步更新,最后返回min_speed即可。判断能否吃完,需要单独写一个函数。

2)运输问题

 

和上一道题类似,有一个最大运载能力,一个最低运载能力,然后通过二分法来找最低的。判断能否运载完需要单独写一个函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值