有序數組旋轉後(如 {3,4,5,1,2}),求最小元素。要求利用有序性優於 O(n)。
旋轉數組可視為兩段遞增子數組拼接,前段 ≥ 後段。最小值位於分界點。設置左右指針 `l=0, r=n-1`:
int SearchMin(int A[], int n) {
if (n <= 0) return -1;
int l = 0, r = n-1;
if (A[r] > A[l]) return A[l];
while (l <= r) {
int mid = (l + r) / 2;
if (A[mid] > A[l]) l = mid;
else if (A[mid] < A[l]) r = mid;
else return A[mid+1];
}
return -1;
}
時間 O(log n),空間 O(1)。若含大量重複元素最壞退化 O(n)。
旋轉數組最小值是二分查找變體的經典應用,關鍵在於識別「兩段有序」結構並正確縮小區間,面試高頻必會。