二分法查找最左和最右

阅读量: 425 编辑

对于有序序列

{ 1, 4, 5, 7, 8, 9, 11, 13 }

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

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

【参考程序】

// 大于等于 target 的最左的位置 
// { 1, 4, 5, 7, 8, 9, 11, 13 }
int findLeft(int arr[], int n, int target) {
    if (target > arr[n - 1]) { // 超过了范围
        return -1;
    }
    int left = 0;
    int right = n - 1;
    int result = -1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] >= target) {
            result = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return result;
}

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

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

【参考程序】

// 小于等于 target 的最右的位置
// { 1, 4, 5, 7, 8, 9, 11, 13 }
int findRight(int arr[], int n, int target) {
    if (target < arr[0]) { // 超过了范围
        return -1;
    }
    int left = 0;
    int right = n - 1;
    int result = -1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] <= target) {
            left = mid + 1;
            result = mid;
        } else {
            right = mid - 1;
        }
    }
    return result;
}
// 1 4 5 7 8 9 11 13
爱码岛编程公众号
试卷资料
爱码岛编程小程序
在线刷题
苏ICP备13052010号
©2023 南京匠成信息科技有限公司