Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
Find the minimum element.
You may assume no duplicate exists in the array.
代码如下:
二分查找变形.
(O(logn)) time, (O(1)) extra space.
// Binary search
int findMin(vector<int>& A) {
int n = A.size(), lo = 0, hi = n - 1, mid;
while (lo < hi) {
if (A[0] < A[n - 1]) return A[0];
mid = (lo + hi) / 2;
if (A[mid] > A[hi]) lo = mid + 1;
else hi = mid;
// 重要思考: 5 6 7 0 1 2 3, 为什么当 A[mid]<=A[hi] 时, 是 hi = mid,而不是 hi = mid - 1 ?
// 1 < 3, 1有可能是要找的值, 故而hi=mid
// 7 > 3, 7必然不是要找的, 而mid+1处才有可能是要找的,故而 lo=mid+1
}
return A[lo];
}