一、查找小于等于目标元素的最后一个元素前言:
本文所有待查找数组均为有序且升序的数组,非则不适用于本文的函数
private int lower_bound(int[] arr,int target)
{
int ans=-1;
int left=0,right=arr.length-1;
while (left<=right)
{
int mid=(left+right)/2;
if(arr[mid]<=target)
{
ans=mid;
left=mid+1;
}
else
{
right=mid-1;
}
}
return ans;
}
仅解释第一份代码,后面原理都是一样的:
首先,用顺序查找逻辑简单,但是效率会很差。所以为了查找的速度选用二分查找。但是这里的二分查找不同于常规的二分,常规的二分查找的是一个精确的值,而我们这里查找的是小于等于目标的最后一个元素,这也就意味着即使你找到了一个小于等于目标的元素,也不能保证这是最后一个元素。所以,当我们找到一个小于等于目标值的元素时,我们需要先记录一下(也就是代码中的ans变量,ans一开始为-1,表示没有找到元素),然后再将left赋值为mid+1,继续往后找,如果后面还有,那么ans变量就会更新,否则,ans就是当前需要找的元素下标。而如果当前元素大于目标值,那么小于等于目标值的元素只能出现在[left,mid-1]区间,直接把right赋值为mid-1就行了。
private int lower(int[] arr,int target)
{
int ans=-1;
int left=0,right=arr.length-1;
while (left<=right)
{
int mid=(left+right)/2;
if(arr[mid]
三、查找大于等于目标元素的第一个元素
private int upper_bound(int[] arr,int target)
{
int ans=-1;
int left=0,right=arr.length-1;
while (left<=right)
{
int mid=(left+right)/2;
if(arr[mid]>=target)
{
ans=mid;
right=mid-1;
}
else
{
left=mid+1;
}
}
return ans;
}
四、查找大于目标元素的第一个元素
private int upper(int[] arr,int target)
{
int ans=-1;
int left=0,right=arr.length-1;
while (left<=right)
{
int mid=(left+right)/2;
if(arr[mid]>target)
{
ans=mid;
right=mid-1;
}
else
{
left=mid+1;
}
}
return ans;
}



