Spurs

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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 33 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 33 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
}
posted on 2017-08-17 12:31  英雄与侠义的化身  阅读(88)  评论(0编辑  收藏  举报