C++有序数组求上下界

  • 求a的下界即求第一个大于等于a的值的位置i,即nums[i]>=a && nums[i-1]<a
  • 使用二分法,伪代码如下
lower_bound(nums, l, r, a):
	if(l > r) 不存在
	mid = (l+r) >> 1
	if(nums[mid] < a) 在右边寻找
	否则,中间值是最左值,中间值即所求
	否则,中间值前一个值小于a,中间值即所求
	否则,在左边寻找
  • 代码
#include <iostream>
#include <vector>

using namespace std;

int lower_bound(vector<int> nums, int l, int r, int a) {
    if(l > r) return -1;
    int mid = (l+r) >> 1;
    if(nums[mid] < a) return lower_bound(nums, mid+1, r, a);
    if(mid == l) return l;
    if(nums[mid-1] < a) return mid;
    return lower_bound(nums, l, mid-1, a);
}

int main(int argc, char** argv) {
    if(argc != 2) {
        cout << "usage: " << argv[0] << " num\n";
        return 0;
    }
    vector<int> v{3,4,5,5,6,6,8,10,10,14,17,17,20};
    int n = v.size();
    int a = stoi(argv[1]);
    cout << lower_bound(v, 0, n-1, a) << endl;
    return 0;
}
  • 上界类似下界,是求最后一个小于等于的值,读者可以先自己尝试
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
int upper_bound(vector<int> nums, int l, int r, int a) {
    if(l > r) return -1;
    int mid = (l+r) >> 1;
    if(nums[mid] > a) return upper_bound(nums, l, mid-1, a);
    if(mid == r) return mid;
    if(nums[mid+1] > a) return mid;
    return upper_bound(nums, mid+1, r, a);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刀么克瑟拉莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值