LintCode 尋找旋轉排序數組中的最小值

1 . 尋找旋轉排序數組中的最小值

假設一個旋轉排序的數組其起始位置是未知的(比如0 1 2 4 5 6 7 可能變成是4 5 6 7 0 1 2)。
你需要找到其中最小的元素。
你可以假設數組中不存在重複的元素。
樣例
給出[4,5,6,7,0,1,2] 返回 0

solution: 本題可以直接使用蠻力法計算複雜度爲O(n),但是使用蠻力法的話會失去本題的意思,因爲數組是由排序數組旋轉之後構成的並且沒有重複的元素,因此,我們可以使用二分法來求解這個問題。
二分法會保持三個索引first, mid 和 last。一個旋轉之後的排序數組其最小值只有三種情況。
1.在mid的左邊
2.就爲mid
3.在mid的右邊
旋轉情況示意圖
因爲數組是由排序數組經過旋轉之後所構成,並且從上面的圖片可以看出,當num[mid] > num[last]時其最小值必定在[mid, last]區間,否則在[first, mid]區間。則,我們可以繼續對這個區間進行判斷直到只有兩個元素時停止計算。
code .

class Solution {
public:
    /**
     * @param num: a rotated sorted array
     * @return: the minimum number in the array
     */
    int findMin(vector<int> &num) {
        // write your code here
        vector<int>::size_type first = 0, last = num.size()-1, mid;

        while ((first + 1) < last) {
            mid = (first + last) / 2;
            if (num[mid] < num[last])
                last = mid;
            else 
                first = mid;
        }

        return num[first] < num[last] ? num[first] : num[last];
    }
};

2 . 尋找旋轉排序數組中的最小值 II

假設一個旋轉排序的數組其起始位置是未知的(比如0 1 2 4 5 6 7 可能變成是4 5 6 7 0 1 2)。
你需要找到其中最小的元素。
數組中可能存在重複的元素
樣例
給出[4,4,5,6,7,0,1,2] 返回 0

solution: 因爲數組中存在相同的元素及有可能存在nums[mid] = nums[last]的情況,這時上面三種情況就不管用了。因爲當nums[mid]=nums[last]時,最小值在mid的左邊還是右邊沒有辦法進行判斷。此時唯一可以確定的是last一定不是最小值(當最小值唯一時),因此我們可以通過把last向前移動一步來減少搜索區間
存在重複元素

code :

class Solution {
public:
    /**
     * @param num: the rotated sorted array
     * @return: the minimum number in the array
     */
    int findMin(vector<int> &num) {
        // write your code here
        vector<int>::size_type first = 0, last = num.size()-1, mid;

        while (first + 1 < last) {
            mid = first + (last - first) / 2;
            if (num[mid] > num[last])
                first = mid;
            else if (num[mid] < num[last])
                last = mid;
            else 
                --last;
        }
        return num[first] < num[last] ? num[first] : num[last];
    }
};
發佈了49 篇原創文章 · 獲贊 22 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章