1. 简介
满足有序性,每次排除一半的可能性。
2. 实现
2.1 手写
int bin_search(vector<int> &arr,int v) {
int hi = arr.size() - 1;
int lo = 0;
while ( lo <= hi)
{
int mid = (lo + hi) >> 1;
if (arr[mid] < v)
lo = mid + 1;
else
hi = mid - 1;
}
return hi;
}
int bin_search(vector<int> &arr, int v)
{
int l = 0, r = sz;
while (l < r) {
int m = (r - l >> 1) + l;
if (arr[m] < v)
l = m + 1;
else
r = m;
}
return l;
}
2.2 STL
lower_bound()
找到第一不小于某个值的位置
- 使用
lower_bound(potions.begin(), potions.end(), tar);
- 实现
template<class ForwardIt, class T>
ForwardIt lower_bound(ForwardIt first, ForwardIt last, const T& value)
{
ForwardIt it;
typename std::iterator_traits<ForwardIt>::difference_type count, step;
count = std::distance(first, last);
while (count > 0)
{
it = first;
step = count / 2;
std::advance(it, step);
if (*it < value)
{
first = ++it;
count -= step + 1;
}
else
count = step;
}
return first;
}
upper_bound()
找到第一个严格大于某个值的位置
- 使用
upper_bound(potions.begin(), potions.end(), tar);
- 实现
template<class ForwardIt, class T>
ForwardIt upper_bound(ForwardIt first, ForwardIt last, const T& value)
{
ForwardIt it;
typename std::iterator_traits<ForwardIt>::difference_type count, step;
count = std::distance(first, last);
while (count > 0)
{
it = first;
step = count / 2;
std::advance(it, step);
if (!(value < *it))
{
first = ++it;
count -= step + 1;
}
else
count = step;
}
return first;
}