lower_bound()
https://www.bilibili.com/video/BV1AP41137w7/?spm_id_from=333.788&vd_source=88184dae257eecf4353eecdafc614dd4
函数lower_bound()在**[lo, hi)进行二分查找,返回大于或等于**target的第一个元素的位置。如果所有元素都小于target,则返回hi.
~~private int lower_bound(int[] nums, int lo, int hi, int target) {
while (lo < hi) {
int mid = lo + (hi - lo) / 2;
if (target > nums[mid]) lo = mid + 1;
else hi = mid;
}
return lo;~~
}
如果是在[lo, hi]进行二分查找,找第一个 >= target的第一个元素下标。如果所有元素都小于target,则返回0,如果所有元素都大于等于target,则返回 hi+1。
// [lo , hi]
private static int lower_bound(int[] nums, int lo, int hi, int target) {
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (nums[mid] < target) lo = mid + 1;
else hi = mid - 1;
}
return lo;
}
upper_bound()
函数upper_bound()在**[lo, hi)进行二分查找,返回大于**target的第一个元素,如果所有元素都小于等于target,则返回hi.
private int upper_bound(int[] nums, int lo, int hi, int target) {
while (lo < hi) {
int mid = lo + (hi - lo) / 2;
if (target >= nums[mid]) lo = mid + 1;
else hi = mid;
}
return lo;
}