二分的条件:
单调不降或单调不升
二分的写法:
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); // v是vector
lower_bound(a, a+n, val);
upper_bound 写法相同
lower_bound 返回的是第一个大于等于val的指针(迭代器),
upper_bound 返回的是第一个严格大于val的指针(迭代器);
如果没有找到返回尾指针 如 v.end()
注意:由于map、set、multiset、multimap不是线性数据结构,所以二分时请直接使用其自带的成员函数
如: 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.二分常与其他算法相结合