自学内容网 自学内容网

二分(左闭右闭)

大于、大于等于、小于、小于等于四种情况
这四种情况是可以相互转换的

大于等于 的第一个:>=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)!