使用二分查找实现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)
- 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;
}
- 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;
}
使用 是为了防止溢出