1. 程式人生 > >[LeetCode] Find Minimum in Rotated Sorted Array II 尋找旋轉有序陣列的最小值之二

[LeetCode] Find Minimum in Rotated Sorted Array II 尋找旋轉有序陣列的最小值之二

Follow up for "Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Suppose a sorted array 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.

The array may contain duplicates.

尋找旋轉有序重複陣列的最小值是對之前問題的延伸(http://www.cnblogs.com/grandyang/p/4032934.html),當陣列中存在大量的重複數字時,就會破壞二分查詢法的機制,我們無法取得O(lgn)的時間複雜度,又將會回到簡單粗暴的O(n),比如如下兩種情況:

{2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1, 2} 和 {2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2}, 我們發現,當第一個數字和最後一個數字,還有中間那個數字全部相等的時候,二分查詢法就崩潰了,因為它無法判斷到底該去左半邊還是右半邊。這種情況下,我們將左指標右移一位,略過一個相同數字,這對結果不會產生影響,因為我們只是去掉了一個相同的,然後對剩餘的部分繼續用二分查詢法,在最壞的情況下,比如陣列所有元素都相同,時間複雜度會升到O(n),參見程式碼如下:

class Solution {
public:
    int findMin(vector<int> &nums) {
        if (nums.empty()) return 0;
        int left = 0, right = nums.size() - 1, res = nums[0];
        while (left < right - 1) {
            int mid = left + (right - left) / 2;
            if (nums[left] < nums[mid]) {
                res 
= min(res, nums[left]); left = mid + 1; } else if (nums[left] > nums[mid]) { res = min(res, nums[right]); right = mid; } else ++left; } res = min(res, nums[left]); res = min(res, nums[right]); return res; } };

參考資料: