Spurs

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

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];
}
posted on 2017-08-16 18:23  英雄与侠义的化身  阅读(87)  评论(0编辑  收藏  举报