二分查找题型

2023-11-01

在所给的数组中找到那个目标数字

区间定义:[l, r) 左闭右开

 int binary_search(vector<int>& nums,int targe)
{
        int l=0;
        r=nums.size();
        while(l<r)
        {
            mid=l+(r-l)/2;
            m=nums[mid];
            if(m==targe)
                  return targe;
            if else(m> targe)
                    r=mid;         //新的范围  [l,mid)
            else
                l=mid+1;             //新的范围  [mid+1,r)
             
        }
        
        return l;   //或者返回找不到
}

另一种题型:找到目标数字的开始的索引和结束索引,所以就是C++的lower_bound和upper_bound。

这两个函数只有一点不同,就是nums[mid]与target的判断,
lower_bound找到是大于等于目标的元素,所以只有nums[mid] < target时才移动左指针;
而upper_bound是大于目标的元素,所以当nums[mid] <= target就向右移动左指针了。

lower_bound返回的是开始的第一个满足条件的位置,
而upper_bound返回的是第一个不满足条件的位置。所以,当两个相等的时候代表没有找到,
如果找到了的话,需要返回的是[left, right - 1].

用法:


fun()
{
    vector<int> v {1,3,4,5,6,7};
    auto l=lower_bound(v.begin(),v.end(),3);   //这个函数返回的是第一个大于等于3 的数,所以返回3
    auto r= upper_bound(v.begin(),v.end(),3);//这个函数返回的是第一个大于3 的数,所以返回4
    return {l,r-1}
}
//若是用自己写的函数的话,每个返回值是其下标,用c++的STL的返回值是迭代器

lower_bound(): 找到一个元素, 像 nums[i] >= targe

int lower_bound(vector<int>& nums,int targe)
{
    const int N=nums.size();
            //范围[l,r)
    int l=0;r=N;
            
     while(l<r)
    {
      int mid=l+(r-l)/2;
      int t=nums[mid];
                
    //比如 {1,2,3,4,5},这是t=nums[2]=3, 若3<targe,我们要的是大于等于目标的数,所以3是不符合的,
      //所以下标一定要往右走一位,可以取到mid+1;
     if(t<targe)      //对比upper_bound()函数,就只有这个if里面的条件不一样
        l=mid+1;         //范围 [mid+1,r)
     else
        r=mid;
    }
            
    return l;
}

upper_bound(): 找到一个元素, 像 nums[i] > targe

int upper_bound(vector<int>& nums,int targe)
{
      const int N=nums.size();
            //[l,r)
     int l=0;r=N;
            
      while(l<r)
      {
         int mid=l+(r-l)/2;
         int t=nums[mid];
         if(t<=targe)
              l=mid+1;         //范围 [mid+1,r)
         else
            r=mid;
       }
            
       return l;  
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二分查找题型 的相关文章

  • Windows Server --- RDP远程桌面服务器激活和RD授权

    RDP远程桌面服务器激活和RD授权 一 激活服务器 二 设置RD授权 系统 Window server 2008 R2 服务 远程桌面服务 注 该方法适合该远程桌面服务器没网络状态下 离线 激活服务器 一 激活服务器 1 打开远程桌面授权管
  • 链表的运用:多项式加法

    通过链表来实现两个多项式的加法 1 创建节点类型 用链表储存多项式则链表的一个节点就代表多项式的某一项 所以一个节点应该包含多项式的系数 多项式的指数以及指向下个节点的指针 2 打印多项式 传入一个指向多项式链表的指针 遍历该链表 依次打印
  • 线性代数的本质——几何角度理解

    B站网课来自 3Blue1Brown的翻译版 看完醍醐灌顶 强烈推荐 线性代数的本质 本课程从几何的角度翻译了线代中各种核心的概念及性质 对做题和练习效果有实质性的提高 下面博主来总结一下自己的理解 1 向量的本质 在物理中的理解是一个有起

随机推荐