[LeetCode] 153. Find Minimum in Rotated Sorted Array 尋找旋轉有序數組的最小值


 

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.

Example 1:

Input: [3,4,5,1,2] 
Output: 1

Example 2:

Input: [4,5,6,7,0,1,2]
Output: 0

 

這道尋找旋轉有序數組的最小值肯定不能通過直接遍歷整個數組來尋找,這個方法過於簡單粗暴,這樣的話,旋不旋轉就沒有意義。應該考慮將時間復雜度從簡單粗暴的 O(n) 縮小到 O(lgn),這時候二分查找法就浮現在腦海。這里的二分法屬於博主之前的總結帖 LeetCode Binary Search Summary 二分搜索法小結 中的第五類,也是比較難的那一類,沒有固定的 target 值比較,而是要跟數組中某個特定位置上的數字比較,決定接下來去哪一邊繼續搜索。這里用中間的值 nums[mid] 和右邊界值 nums[right] 進行比較,若數組沒有旋轉或者旋轉點在左半段的時候,中間值是一定小於右邊界值的,所以要去左半邊繼續搜索,反之則去右半段查找,最終返回 nums[right] 即可,參見代碼如下:

 

解法一:

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

 

下面這種分治法 Divide and Conquer 的解法,由熱心網友 howard144 提供,這里每次將區間 [start, end] 從中間 mid 位置分為兩段,分別調用遞歸函數,並比較返回值,每次取返回值較小的那個即可,參見代碼如下:

 

解法二:

class Solution {
public:
    int findMin(vector<int>& nums) {
        return helper(nums, 0, (int)nums.size() - 1);
    }
    int helper(vector<int>& nums, int start, int end) {
        if (nums[start] <= nums[end]) return nums[start];
        int mid = (start + end) / 2;
        return min(helper(nums, start, mid), helper(nums, mid + 1, end));
    }
};

 

討論:對於數組中有重復數字的情況,請參見博主的另一篇博文 Find Minimum in Rotated Sorted Array II

 

Github 同步地址:

https://github.com/grandyang/leetcode/issues/153

 

類似題目:

Search in Rotated Sorted Array

Find Minimum in Rotated Sorted Array II

 

參考資料:

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/discuss/48493/Compact-and-clean-C%2B%2B-solution

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/discuss/48484/A-concise-solution-with-proof-in-the-comment

 

LeetCode All in One 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM