二分法总结

关于左边界:
当目标元素 target 不存在数组 nums 中时,搜索左侧边界的二分搜索的返回值可以做以下几种解读:

1、返回的这个值是 nums 中大于等于 target 的最小元素索引。
2、返回的这个值是 target 应该插入在 nums 中的索引位置。
3、返回的这个值是 nums 中小于 target 的元素个数。
比如在有序数组 nums = [2,3,5,7] 中搜索 target = 4,搜索左边界的二分算法会返回 2,你带入上面的说法,都是对的。

// 寻找左边界
var leftbound = function(nums, target) {
    var left = 0;
    var right = nums.length - 1;
    while(left <= right) {
        var mid = Math.floor(left+(right-left)/2);
        if(nums[mid] === target) {
            right= mid - 1;
        }else if(nums[mid] > target) {
            right = mid - 1; 
        }else if(nums[mid] < target) {
            left = mid + 1; 
        }
    }
    if(left < 0 || left >= nums.length) {
        return -1;
    }
    return nums[left] === target ? left : -1;
}

// 寻找右边界
var rightbound = function(nums, target) {
    var left = 0;
    var right = nums.length - 1;
    while(left <= right) {
        var mid = Math.floor(left+(right-left)/2);
        if(nums[mid] === target) {
            left = mid + 1;
        }else if(nums[mid] > target) {
            right = mid - 1; 
        }else if(nums[mid] < target) {
            left = mid + 1; 
        }
    }
    if(right < 0 || right >= nums.length) {
        return -1;
    }
    return nums[right] === target ? right : -1;
}
posted @ 2023-08-22 23:59  拉肥尔  阅读(17)  评论(0)    收藏  举报