Administrator
发布于 2024-11-09 / 7 阅读
0

3种二分搜索

二分搜索分为三种,搜索一个数找不到就返回-1的,搜索左边界的,搜索右边界的。

先看循环条件:
搜索一个数的话,left <= right
搜索边界的话,left < right

核心情况在于nums[mid] == target
搜索一个数的话,返回mid
搜索左边界,right = mid
搜索右边界,left = mid + 1

返回值要注意的就是
搜索左边界,返回left或right
搜索右边界,返回left - 1或right - 1
// 搜索一个数

int binarySearch(int[] nums, int target) {
    int left = 0; 
    int right = nums.length - 1; // 注意
 
    while(left <= right) {
        int mid = (right + left) / 2;
        if(nums[mid] == target)
            return mid; 
        else if (nums[mid] < target)
            left = mid + 1; // 注意
        else if (nums[mid] > target)
            right = mid - 1; // 注意
        }
    return -1;
}

// 搜索左边界

int left_bound(int[] nums, int target) {
    if (nums.length == 0) return -1;
    int left = 0;
    int right = nums.length; // 注意
    
    while (left < right) { // 注意
        int mid = (left + right) / 2;
        if (nums[mid] == target) {
            right = mid;
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid; // 注意
        }
    }
    return left;
}


// 搜索右边界

int right_bound(int[] nums, int target) {
    if (nums.length == 0) return -1;
    int left = 0, right = nums.length;
    
    while (left < right) {
        int mid = (left + right) / 2;
        if (nums[mid] == target) {
            left = mid + 1; // 注意
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid;
        }
    }
    return left - 1; // 注意
}