二分(左闭右闭)
大于、大于等于、小于、小于等于四种情况
这四种情况是可以相互转换的
大于等于 的第一个:>=x
大于 的第一个 : >x 等价于 >= (x+1)
小于 的最后一个:<x等价于 (>=x) - 1(大于等于x 的 左边的那个数)
小于等于 的最后一个:<=x等价于(>x) - 1 =【(>=(x+1)) - 1】(大于x 的 左边那个数)
左闭右闭
// lowerBound 返回最小的满足 nums[i] >= target 的 i
// 如果数组为空,或者所有数都 < target,则返回 nums.length
// 要求 nums 是非递减的,即 nums[i] <= nums[i + 1]
// 闭区间写法 , 返回第一个满足nums[i] >= target 的 i
private int lowerBound(int[] nums, int target) {
int left = 0, right = nums.length - 1; // 闭区间 [left, right]
while (left <= right) { // 区间不为空
// 循环不变量:
// nums[left-1] < target
// nums[right+1] >= target
int mid = left + (right - left) / 2;
if (nums[mid] < target)
left = mid + 1; // 范围缩小到 [mid+1, right]
else
right = mid - 1; // 范围缩小到 [left, mid-1]
}
return left; // 或者 right+1
}
原文地址:https://blog.csdn.net/2302_78946634/article/details/143687653
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!