二分法--模版--必须背过

文章提供了一个Java实现的二分查找算法,强调了避免死循环的处理方式,特别是在数组中目标值出现多次的情况。代码中通过确保`start+1<end`作为循环条件来防止特定边界问题,并对更新`start`和`end`的策略进行了说明。
摘要由CSDN通过智能技术生成
/**
 * @author
 * @Date 2023/5/9 23:39
 */
public class Solution {

    /**
     * 二分法模版 必须背过
     */
    public int binarySearch(int[] nums, int target) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        int start = 0, end = nums.length - 1;
        // 用 start+ 1< end 而不是 start < end 的目的是为了避免死循环
        // 在 first position of target 的情况下不会出现死循环
        // 但是在 last position 的情况下会出现死循环
        // 样例 : nums =  [1,1] ,target = 1
        // 为了🙆统一模版,我们就都采用 start + 1 < end 就保证不会出现死循环
        while (start + 1 < end) {
            // python 没有 overflow 的问题 直接 // 2 就可以了
            // java 和 C++ 最好写成 mid = start + (end - start) /2
            // 防止在 start = 2^31 -1, end = 2^31 -1 的情况下出现加法 overflow
            int mid = start + (end - start) / 2;

            // > , = , < 的逻辑先分开写, 然后在看看 = 的情况是否能合并到其他分支里
            if (nums[mid] < target) {
                // 写作 start = mid +1 也是正确的
                // 只是可以偷懒不写, 因为不写也没问题 不会影响时间复杂度
                // 不写的好处是 万一你不小心写成了 mid -1 你就错了
                start = mid;
            } else if (nums[mid] == target) {
                end = mid;
            } else {
                // 写作 end = mid -1 也是正确的
                // 只是可以偷懒不写 因为不写也没问题 不会影响时间复杂度
                // 不写的好处是,万一你不小心写成了 mid - 1 你就错了
                end = mid;
            }
        }

        // 因为上面的循环退出条件是 start+1 < end
        // 因此这里循环结束的时候 start 和end 的关系是相邻关系(1 和 2 ,3 和 4 这种)
        // 因此需要再单独判断 start 和 end 这两个数谁是我们要的答案
        // 如果是找  first position of target 就先看 start, 否则就看 end
        if (nums[start] == target) {
            return start;
        }
        if (nums[end] == target) {
            return end;
        }
        return -1;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值