Follow up for "153. Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
Example 1:
0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
.
Example 2:
1 3 3 3
might become 3 3 1 3
.
Find the minimum element.
解题重点:
仍然考虑 5 6 7 0 1 2 3
, 再结合3 3 1 3
或 3 1 3 3
来思考.
重要思考:
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.
本题再结合3 3 1 3
或3 1 3 3
来思考.
当 A[mid] == A[hi] 时候, hi 所指的 3 就没用了, 往前挪挪, hi--
与 153题想比, 当A[mid] == A[hi] 时候, hi--就行了.
(O(logn)) time, (O(1)) extra space.
//思考时最好仍基于 5 6 7 0 1 2 3
int findMin(vector<int>& A) {
int lo = 0, hi = A.size() - 1, mid;
while (lo < hi) {
mid = (lo + hi) / 2;
if (A[mid] > A[hi]) lo = mid + 1;
else if (A[mid] < A[hi]) hi = mid;
else hi--; // 此时 A[mid] == A[hi]
}
return A[lo]; //此时 lo == hi
}