二分搜索的使用技巧

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章