1.搜索第一個等於key或第一個大於key的值
比如1 ,2,3,3,3,4中,若key爲3,則取第一個3
int binarySearch1(int arr[], int left, int right, int key) //第一個>=key
{
int mid;
while (left <= right)
{
mid = ( left + right ) / 2;
if (arr[mid] >= key)
{
right = mid - 1;
}
else left = mid + 1;
}
return left;
}
2.搜索最後一個等於key或最後一個小於key的值:
比如1 ,2,3,3,3,4中,若key爲3,則取最後一個3
int binarySearch2(int arr[], int left, int right, int key) //最後一個<=key
{
int mid;
while (left <= right)
{
mid = ( left + right ) / 2;
if (arr[mid] > key)
{
right = mid - 1;
}
else left = mid + 1;
}
return right;
}
至於爲什麼需要這種技巧呢,因爲上次做筆試,題目記不太清了,是要求找一個數,使用它計算一個值,假設爲func(k),其中func()是關於k的增函數,要使func(k)>某個number, 但是k又要最小,因此就可以改造第一個方法來進行二分搜索這個k。改造方法大致如下
int binarySearch1(int left, int right, int key) //第一個>=key
{
int mid;
while (left <= right)
{
mid = ( left + right ) / 2;
if (func(mid) >= key)
{
right = mid - 1;
}
else left = mid + 1;
}
return left;
}