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

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

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.

You may assume no duplicate exists in the array.

這道尋找旋轉有序陣列的最小值肯定不能通過直接遍歷整個陣列來尋找,這個方法過於簡單粗暴,這樣的話,旋不旋轉就沒有意義。應該考慮將時間複雜度從簡單粗暴的O(n)縮小到O(lgn),這時候二分查詢法就浮現在腦海。

首先要判斷這個有序陣列是否旋轉了,通過比較第一個和最後一個數的大小,如果第一個數小,則沒有旋轉,直接返回這個數。如果第一個數大,就要進一步搜尋。我們定義left和right兩個指標分別指向開頭和結尾,還要找到中間那個數,然後和left指的數比較,如果中間的數大,則繼續二分查詢右半段陣列,反之查詢左半段。終止條件是當左右兩個指標相鄰,返回小的那個。程式碼如下:

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

對於陣列中有重複數字的情況,請參見我的另一篇博文: