在<algorithmn>库中,有一个lower_bound函数,它的作用是:
对于一个递增序列(x[i+1] >= x[i]),找到第一个位置i,使得x[i] >= target
举个例子:
vector<int> v = {1, 1, 3, 3, 5, 5};
int num = lower_bound(v.begin(), v.end(), 4) - v.begin();
num的值为4
这里我们实现一个低配版lower_bound函数,我们的目标是,对于一个严格递增序列(x[i+1] >
x[i]),找到第一个位置i,使得x[i] >= target
int lower_pos(vector<int> & x, int val)
//找到第一个pos,使val大于pos之前的数
{
int left = 0;
int right = dp.size()-1;
int mid;
while(left <= right)
{
mid = (left + right) / 2;
if(x[mid] < val)
left = mid + 1;
else if(x[mid] > val)
right = mid - 1;
else
return mid;
}
return left;
}
说明:
如果 x[mid] == val,那么mid是我们要找的pos
如果在序列中没有找到完全匹配的值,在跳出递归之前的最后一次循环,一定有left = right = mid
如果 x[mid] < val,那么left = mid + 1,此时的mid + 1或者left是我们要找的pos
如果x[mid] > val,那么right = mid - 1,此时left仍然是我们要找的pos