每次写2分的时候都头疼,都要考虑怎样防止边界,上限还是下限这些问题,所以这里破竹直接教大家用C++ stl中的lower_bound和upper_bound这两个算法,基本解决全部小细节问题!!! java,python一样可以按照这总写法。
- lower_bound
这个是返回非递减序列[first, last)中第一个大于或者等于val的位置
int lower_bound(int *array, int size, int key)
{
int first = 0, middle;
int half, len;
len = size;
while(len > 0) {
half = len >> 1;
middle = first + half;
if(array[middle] < key) {
first = middle + 1;
len = len-half-1;
}
else
len = half;
}
return first;
}
2.upper_bound
这个是返回非递减序列[first, last)中第一个大于val的位置
int upper_bound(int *array, int size, int key)
{
int first = 0, len = size-1;
int half, middle;
while(len > 0){
half = len >> 1;
middle = first + half;
if(array[middle] > key)
len = half;
else{
first = middle + 1;
len = len - half - 1;
}
}
return first;
}