zoukankan      html  css  js  c++  java
  • 【算法】【二分】二分查找总结

    找精确值模板

    int l = 0, r = n - 1;
    while(l <= r)
    {
        int mid = l + r >> 1;
        if(arr[mid] == target) return mid;
        else if(arr[mid] > target) r = mid - 1;
        else l = mid + 1;
    }
    return -1;
    
    

    查找大于等于/大于 target 的第一个元素

    int l = 0, r = n - 1;
    //设mid = i, 
    //如果nums[mid] > target, 那么r = l = i; 跳出循环;
    //如果nums[mid] < target,  那么l = r = i + 1; 跳出循环;
    //不存在死循环
    while(l < r)
    {
        //找大于等于target的第一个元素
        int mid = (l + r)  >> 1;
        if(nums[mid] >= target) r = mid; //如果是大于 改成 >
        //因为要找比nums[mid]大的元素,所以nums[mid]肯定不是答案 已经判断过了; l = mid + 1;
        else l = mid + 1; 
    }
    return l;
    

    查找小于等于/小于 target 的最后一个元素

    int l = 0, r = n - 1;
    while(l < r)
    {
        //找小于等于target的最后一个元素
        int mid = (l + r + 1)  >> 1;
        //考虑只剩下nums[i]和nums[i + 1],如果不加1,那么mid = i;
        //如果nums[mid] < target, 更新后 l = mid, r = mid + 1;会产生死循环;
        //加上1以后,mid = i + 1;
        //如果nums[mid] < target, l = r = mid + 1; 跳出循环;
        //如果nums[mid] > target, l = r = i; 跳出循环; 
        if(nums[mid] <= target) l = mid; //如果是小于 改成 <
        else r = mid - 1;
    }
    return l;
    

    说明

    循环的判断条件l <= r?

    • 区间变换思路是不断的舍去不可能是解的区间,最后只剩下一个数就是我们的解。而第一种情况就算最后只剩一个数也有可能不是解,所以需要使用小于等于。
  • 相关阅读:
    如果int x=20, y=5,则语句System.out.println(x+y +""+(x+y)+y); 的输出结果是()
    子父类存在同名成员时super的使用条件
    7mysql高级查询
    1udp编程
    6mysql外键
    4mysql数据表增删改查
    5mysql数据类型
    3mysql数据库操作
    2mysql基本使用
    1mysql安装
  • 原文地址:https://www.cnblogs.com/Trevo/p/13547635.html
Copyright © 2011-2022 走看看