函数一
lower_bound(查找数组的初始地址**//左边界**,查找数组末尾地址**//右边界**,要查找的元素值)//可知我们返回的是一个地址,如果再减去一个数组首地址,则为返回了数组的下标。
lower_bound(arr,arr+1+n)-arr.
作用 查找到数组中第一个大于等于查找元素的下标。
特别的(lower_bound(arr,arr+1+n),x)-arr-1.
作用返回最后一个小于x元素的下标。
STL包装函数代码
lower_bound(arr,arr+n,x) - arr.//数组开始,数组末尾,查找元素。减去数组首地址。
lower_bound(arr,arr+1+n),x)-arr-1//找到最后一个小于x的下标
手写代码
int Lower_bound(int x)//找到第一个大于等于x的下标,另外一个类似,我就不写了哈。
{
int l = 1,r = n;//l为数组开始位置,r为数组结束位置
while(l <= r)
{
int mid = (r+l)/2;
if(arr[mid] > x)
r = mid-1;
else
l = mid +1;//防止出现当l = 4,r = 5这种死循环。
if(arr[mid] == x)
{
if(arr[1] == x)
return 1;
else
{
while(arr[mid] == x)
mid--;
return mid+1;
}
//因为是查找到第一个大于等于的元素,所以后面呀一个判断。
}
}
}
函数二
upper_bound(查找数组的初始地址**//左边界**,查找数组末尾地址**//右边界**,要查找的元素值)//同理,返回的是一个地址,我们减去数组首地址可得查找到的下标。
upper_bound(arr,arr+n,x)-arr。
作用 找到第一个大于x元素的下标。
特别的 upper_bound(arr,arr+n,x)-arr-1。
作用 找到最后一个小于等于x元素的下标。
STL包装函数代码
upper_bound(arr,arr+n,x)-arr;//找到第一个大于x元素的下标
upper_bound(arr,arr+n,x)-arr-1;// 找到最后一个小于等于x元素的下标
这里的手写代码与上面的类似,稍微改动即可。
函数三
binary_search(查找数组的初始地址**//左边界**,查找数组末尾地址**//右边界**,要查找的元素值)。这个函数的返回值不是地址,而是布尔类型的值,意思就是真与假。
binary_search(arr,arr+n,x)
作用 判断数组arr中是否存在x这样一个元素,如果存在,返回1,否返回0.
STL包装函数代码
binary_search(arr,arr+n,x);
手写代码
bool serach(int x)
{
int l = 1,r = n;//l为数组开始下标,r为数组结束下标
while(l <= r)
{
int mid = (r+l)/2;
if(arr[mid] > x)
r = mid-1;
else
l = mid+1;
if(arr[mid] == x)
return true;
}
return false;
}