1. 程式人生 > 其它 >關於整型while(left<=right)類二分法的新發現。

關於整型while(left<=right)類二分法的新發現。

技術標籤:入門新手二分法演算法

關於整型while(left<=right)類二分法的新發現。
做“最少攔截系統”這道題時看到一個二分解法http://www.myexceptions.net/c/1805037.html。
題解看了很長時間沒怎麼看懂,最後研究了下while(l<=r)這類二分法,才發現其實核心思想很簡單而且精妙。
先說結論:(底附一個while(left<=right)類整型二分模板)
從小到大排序對下標進行二分搜尋,沒有找到精確答案(A[i]==a),退出迴圈時:
1.必然是right在左,left在右,left=right+1的情況。
2.若答案不在首尾:left是剛好(第一個)大於目標的下標,right是剛好(最後一個)小於目標的下標,拿陣列A:2 4 6 8 10舉例,對7搜尋,A[left]必然是8,A[right]必然是6,即A[left]=8剛好大於7,A[right]=6剛好小於7。

3.答案在首尾:同理。在首,left不變,剛好是第一個大於目標的下標,right變為-1。在尾,right不變,left變為sizeof(A)/sizeof(A[0])+1。

while(l<=r)
{
	mid=(l+r)/2;  
	if(f[mid]==a)
	{
		l=mid;
		break;
	}
	else if(f[mid]<a)
		l=mid+1;
	else
		r=mid-1;
 }