演算法學習-查詢旋轉陣列的最小值

HelloNiGeSB發表於2016-12-05

題目

假定一個排序陣列以某個位置元素為支點做了旋轉,如:原陣列0 1 2 4 5 6 7旋轉後得到 4 5 6 0 1 2.請找出旋轉後陣列的最小值,假定陣列中沒有重複數字

分析

旋轉之後的陣列實際上可以劃分成兩個有序的組陣列:前面子陣列的大小都大於後面子陣列的元素,注意到實際上最小的元素就是兩個子陣列的分界線

用索引left,right分別指向收尾元素,元素不重複。

若子陣列是普通升序陣列,則A[left]<A[right]。

若子陣列是迴圈升序陣列,前半段子陣列的元素全部大於後半段子陣列中的元素:A[left]>A[right]

計算中間位置mid=(low+hight)/2

顯然,A[low...mid]與A[mid+1...high]必有一個是迴圈升序陣列,一個是普通升序陣列。

若:A[mid]>A[high],說明子陣列A[mid+1,mid+2,...high]迴圈升序;更新low=mid+1;

若:A[mid]<A[high],說明子陣列A[mid+1,...mid+2,...high]普通升序,更新hight=mid;


程式碼如下,也是二分法

int FindMin(int* num, int size)
{
	int low = 0;
	int high = size - 1;
	int mid;
	while (low < high)
	{
		mid = (high + low) / 2;
		if (num[mid] < num[high])
			high = mid;
		else if (num[mid] > num[high])
			low = mid + 1;
	}
	return num[low];
}


相關文章