有重复元素的二分

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

普通二分

  • 思路:逐渐缩小区间,直到找到,或者找不到,跳出循环
    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)

相关文章
|
11月前
|
搜索推荐 算法 测试技术
C++桶排序算法的应用:存在重复元素 III
C++桶排序算法的应用:存在重复元素 III
|
4月前
|
索引
【力扣】217. 存在重复元素、219. 存在重复元素 II
【力扣】217. 存在重复元素、219. 存在重复元素 II
|
11月前
|
索引
【Leetcode -217.存在重复元素 -Leetcode-219.存在重复元素Ⅱ】
【Leetcode -217.存在重复元素 -Leetcode-219.存在重复元素Ⅱ】
36 0
|
4月前
|
索引
leetcode-219:存在重复元素 II
leetcode-219:存在重复元素 II
26 0
|
4月前
leetcode-217:存在重复元素
leetcode-217:存在重复元素
31 0
|
算法 索引
LeetCode 算法 | 数组中有重复元素吗(II)?
LeetCode 算法 | 数组中有重复元素吗(II)?
【C剑指offer】03数组中的重复元素
【C剑指offer】03数组中的重复元素
70 0
【C剑指offer】03数组中的重复元素
LeetCode 217. 存在重复元素
给定一个整数数组,判断是否存在重复元素。
69 0
leetcode 存在重复元素
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。