经典算法

二分法查找最左和最右

1、满足大于等于 target 最靠左的位置;

比如 1 4 5 7 8 9 11 13

大于等于 6 最靠左的位置(是元素7,位置是3);比如大于等于 8 最靠左的位置(是元素9,位置是5)。

2、满足小于等于 target 最靠右的位置;

小于等于 6 最靠右的位置(元素是5,下标是2);比如小于等于 8 最靠右的位置(元素是7,下标是 3)。

【输入样例】

//右侧最左的位置
int binarySearch(int arr[], int n, int target) {
    if (target >= arr[n - 1])
        return -1;

    int left = 0;
    int right = n - 1;
    while (left < right) { //不能 <= ,相等了而没有return,会死循环
        //取中心时靠近左端点
        int mid = left + (right - left) / 2;
        if (arr[mid] > target)
            right = mid; // mid不能-1
        else
            left = mid + 1;
    }

    return left;
}



//左侧最右的位置
int binarySearch(int arr[], int n, int target) {
    if (target <= arr[0]) return -1;
    int left = 0;
    int right = n - 1;

    while (left < right) {
        //取中心时靠近右端点
        int mid = left + (right - left + 1) / 2;
        if (arr[mid] >= target)
            right = mid - 1;
        else
            left = mid; // mid不能+1
    }

    return right;
}