首页 > 其他 > 详细

二分查找

时间:2020-01-11 16:01:45      阅读:70      评论:0      收藏:0      [点我收藏+]

0 基本型

对于一个没有重复元素的有序数组,查找某个元素。
我最常用的板子是左闭右开[l, r)

int biSearch(vector<int>& nums, int target) {
    int l = 0, r = nums.size();
    while (l < r) {
        int mid = (l + r) / 2;
        if (target == nums[mid])
            return mid;
        if (target > nums[mid])
            l = mid + 1;
        else
            r = mid;
    }
    return -1;   // not found
}

1 lower_bound()

数组有重复元素,查找满足\(x>=target\)的最小\(x\)的index:

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

可变形为查找最后一个小于\(target\)的数:即\(l-1\)

2 upper_bound()

数组有重复元素,查找满足\(x>target\)的最小\(x\)的index:

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

可变形为查找最后一个小于\(target\)的数:即\(l-1\)

二分查找

原文:https://www.cnblogs.com/EIMadrigal/p/12179993.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!