1.寻找左侧边界
需求:在nums数组中查找第一个大于等于target的元素出现的位置
int leftBound(int[] nums, int target){
if(nums.length == 0) return 0;
int left = 0;
int right = nums.length; // 左闭右开区间
while(left < right){ // 终止条件left==right
int mid = left + (right - left) / 2;
if(nums[mid] >= target){
right = mid // 搜索区间往左移
}else{
left = mid + 1; // 搜索区间往右移
}
}
return left; // 这里其实可以继续判断,如果left越界了或者nums[left]!=target说明没找到target
}
2.寻找右侧边界
需求:在nums数组中查找最后一个大于等于target的元素出现的位置
int rightBound(int[] nums, int target){
if(nums.length == 0) return 0;
int left = 0;
int right = nums.length; // 左闭右开区间
while(left < right){ // 终止条件left==right
int mid = left + (right - left) / 2;
if(nums[mid] <= target){
left = mid + 1;
}else{
right = mid;
}
}
return left - 1; // 这里left-1才是要找的位置
}