Java实现lowerBound和upperBound函数

使用二分查找实现lower_bound()和upper_bound()操作

  • 如果数组中没有元素就直接返回-1
  • lowerBound找到小于等于当前元素的最大元素下标
  • upperBound找到大于当前元素的最小元素下标
1, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10
         ^		  ^
lowerBound(int[] a, int l, int r, int target)
upperBound(int[] a, int l, int r, int target)
  1. lowerBound
// 返回第一个小于或者等于target的元素下标
private int lowerBound(int[] a, int l, int r, int target){
    if (target < a[0]){
        return -1;
    }
    if (Arrays.binarySearch(a, l, r, target) < 0){
        return -1;
    }
    while (l < r){
        int mid = l + (r-l)/2;
        if (target > a[mid]){
            l = mid + 1;
        }else {
            r = mid;
        }
    }
    return l;
}
  1. upperBound
// 返回第一个大于target的元素下标
private int upperBound(int[] a, int l, int r, int target){
    if (target >= a[r-1]){
        return r;
    }
    if (Arrays.binarySearch(a, l, r, target) < 0){
        return -1;
    }
    while (l < r){
        int mid = l + (r-l)/2;
        if (target >= a[mid]){  // 就一个 = 的区别
            l = mid + 1;
        }else {
            r = mid;
        }
    }
    return l;
}

使用 m i d = l + ( r l ) / 2 mid = l + (r-l)/2 是为了防止溢出

原创文章 187 获赞 29 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_43826242/article/details/106087469