有重复元素的二分

简介: 快速学习有重复元素的二分

普通二分

  • 思路:逐渐缩小区间,直到找到,或者找不到,跳出循环
    int l=0;
    int r=arr.length-1;
    int mid=0;
    while(l<=r) {
      mid=l+((r-l)>>1);
      if(arr[mid]==value)
        return mid;
      else if(arr[mid]>value)
        r=mid-1;
      else
        l=mid+1;
    }
      return -1;


有重复元素的二分

取第一个

  • 当遇到arr[mid]==value时,不跳出循环,左区间不动,右区间会逐渐缩小
  • mid=l+((r-l)>>1)本身自动向下取整,举例 l=k,r=k+1,(l+r)/2=k,mid值会逐渐向左区间靠近,左区间不动区间,因此右区间逐渐缩小,最后l==r

    int l=0;
    int r=arr.length-1;
    int mid=0;
    while(l<r) {
      mid=l+((r-l)>>1);
      if(arr[mid]>=value)
        r=mid;
      else
        l=mid+1;
    }
    if(arr[l]==value)
      return l;
    else
      return -1;

取最后一个

  • 当遇到arr[mid]==value时,不跳出循环,右区间不动,左区间会逐渐缩小
  • mid=l+((r-l+1)>>1);向上取整,举例 l=k,r=k+1,(l+r+1)/2=k+1,mid值会逐渐向右区间靠近,左区间不懂区间,因此左区间逐渐缩小,最后l==r
    int l=0;
    int r=arr.length-1;
    int mid=0;
    while(l<r) {
      mid=l+((r-l+1)>>1);//向上取整
      if(arr[mid]>value)
        r=mid-1;
      else
        l=mid;
    }
    if(arr[l]==value)
      return l;
    else
      return -1;

时间复杂度

O(logn)

相关文章
|
搜索推荐 算法 测试技术
C++桶排序算法的应用:存在重复元素 III
C++桶排序算法的应用:存在重复元素 III
|
7月前
|
索引
【力扣】217. 存在重复元素、219. 存在重复元素 II
【力扣】217. 存在重复元素、219. 存在重复元素 II
|
7月前
leetcode:217. 存在重复元素(先排序再比较邻位)
leetcode:217. 存在重复元素(先排序再比较邻位)
32 0
|
7月前
|
算法 测试技术 C#
[二分查找]LeetCode2040:两个有序数组的第 K 小乘积
[二分查找]LeetCode2040:两个有序数组的第 K 小乘积
|
索引 容器
存在重复元素II
存在重复元素II
64 0
|
机器学习/深度学习 存储 人工智能
“二分“==“二分查找“ ?“yes“:“no“;
“二分“==“二分查找“ ?“yes“:“no“;
127 0
|
算法
存在重复元素
存在重复元素
50 0
|
人工智能 C++
数组排序之桶排序
利用一维数组的知识简单实现桶排序,即对计算机随机读入的0-20之间的5个数从小到大排序
67 0
【C剑指offer】03数组中的重复元素
【C剑指offer】03数组中的重复元素
80 0
【C剑指offer】03数组中的重复元素
|
算法
全排列:不含重复元素和含重复元素的全排列
全排列:不含重复元素和含重复元素的全排列
113 0