二分查找变体问题
假设数组是这样的(有重复)
{1,3,4,5,6,8,8,8,11,18}
class Solution {
public:
//第一个等于给定值的值
int firstEqualSerach(int a[] ,int n,int value)
{
int low = 0;
int high = n - 1;
while (low <= high)
{
int mid = low + ((high - low) >> 1);
if (a[mid]>value)
{
high = mid - 1;;
}
else if(a[mid]<value)
{
low = mid + 1;
}
else
{
if (mid == 0 || a[mid - 1] != value)
{
return mid;
}
else
{
high = mid - 1;
}
}
}
return -1;
}
//最后一个值等于给定值的元素
int lastEqualSearch(int a[],int n,int value)
{
int low = 0;
int high = n - 1;
while (low <= high)
{
int mid = low + ((high - low) >> 1);
if (a[mid] > value)
{
high = mid -1;
}
else if (a[mid] < value)
{
low = mid + 1;
}
else
{
if (mid == n - 1 || a[mid-1]!=value)
{
return mid;
}
else
{
low = mid + 1;
}
}
}
}
//查找第一个大于等于给定值的元素
int firstLargerSearch(int a[],int n,int value)
{
int low = 0;
int high = n - 1;
while (low <= high)
{
int mid = low + ((high - low) >> 1);
if (a[mid] < value)
{
low = mid + 1;
}
else
{
if (mid == 0 || a[mid] < value)
{
return mid;
}
else
{
high = mid - 1;
}
}
}
}
//查找最后一个小于等于给定值的元素
int lastSmallerSearch(int a[],int n,int value)
{
int low = 0;
int high = n - 1;
while (low <= high)
{
int mid = low + ((high - low)>>1);
if (a[mid] > value)
{
high = mid - 1;
}
else
{
if (mid == n - 1 || a[mid + 1] > value)
{
return mid;
}
else
{
low = mid + 1;
}
}
}
}
};