浅谈二分的边界问题

https://www.luogu.com.cn/blog/HOJQVFNA/qian-tan-er-fen-di-bian-jie-wen-ti
LeetCode 35. 搜索插入位置
2020

int searchInsert(vector<int>& nums, int target) {
    int lb = 0,ub = nums.size()-1;
    while (lb <= ub) {
        int mid = (lb + ub)/2;
        if(nums[mid] == target) return mid;
        else if(nums[mid] < target) {
            lb = mid + 1;
        } else{
            ub = mid - 1;
        }
    }
    return lb;
}

2022

int searchInsert(vector<int>& nums, int target) {
        int left = 0, right = nums.size();
        int mid;
        while(left < right) {
            mid = left + ((right - left) >> 1);
            if(nums[mid] == target) return mid;
            else if(nums[mid] < target) left = mid + 1;
            else right = mid;
        }
        return left;
    }

LeetCode 278.第一个错误的版本

\[1 <= bad <= n <= 2^{31} - 1 \]

int firstBadVersion(int n) {
        int left = 1, right = n;
        while(left < right) {
            int mid = left + ((right - left) >> 1);
            if(isBadVersion(mid)) {
                if(mid == 0 || (mid > 0 && !isBadVersion(mid - 1))) return mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }

LeetCode 704. 二分查找

int search(vector<int>& nums, int target) {
        int left = 0, right = nums.size();
        int mid;
        while(left < right) {
            mid = (left + right) >> 1;
            if(nums[mid] == target) return mid;
            else if(nums[mid] < target) left = mid + 1;
            else right = mid;
        }
        if(nums[mid] != target) return -1;
        return mid;
    }

lower_bound & upper_bound

在从小到大的排序数组中,

lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

在从大到小的排序数组中

lower_bound( begin,end,num,greater() ):从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num,greater() ):从数组的begin位置到end-1位置二分查找第一个小于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
————————————————
版权声明:本文为CSDN博主「brandong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40160605/article/details/80150252

posted @ 2020-07-16 07:23  Zforw  阅读(54)  评论(0编辑  收藏  举报