二分搜索

二分的条件:

单调不降或单调不升

二分的写法:

int low = 100, high = 999, mid;
while(low < high){
    mid = (low + high) / 2;
    if(aim <= mid)
        high = mid;
    else
        low = mid + 1;
}
return low;
int low = 100, high = 999, mid;
while(low < high){
    mid = (low + high) / 2;
    if(aim <= mid)
        high = mid;
    else
        low = mid + 1;
}
return low;

mid = ( low + high ) / 2;

mid = low + ( high – low ) / 2;

STL中的二分:

lower_bound(v.begin(), v.end(), val); // vvector

lower_bound(a, a+n, val);

upper_bound 写法相同

lower_bound 返回的是第一个大于等于val的指针(迭代器)

upper_bound 返回的是第一个严格大于val的指针(迭代器);

如果没有找到返回尾指针    v.end()

注意:由于mapsetmultisetmultimap不是线性数据结构,所以二分时请直接使用其自带的成员函数

如:  set<int> se;   se.lower_bound(val);

二分常见题型举例:

1.从有序数组中查找某个值

2.假定一个解并判断是否可行  POJ 1064

3.最大化最小值  POJ 2456

4.最大化平均值  POJ 3111

需要注意的一些地方:

1.只有满足单调性才能使用二分

2.没有正确的更新 low high 导致死循环

3.对于有重复数值的数组,弄清找的是第一个出现位置还是最后一个出现位置,以及如何去找

4.有时 low high int

5.二分常与其他算法相结合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值