leetcode154_尋找旋轉排序數組中的最小值||_二分查找

1. 這一題和leetcode153最大的區別就是可以擁有重複元素.

2. 照例使用二分查找, 重點看下else那裏,最長的註釋部分解釋.

3. 可以參考二分查找模板, https://blog.csdn.net/qieyuan4083/article/details/102526281, 這是二分查找通用模板.

class Solution {
public:
    int findMin(vector<int>& nums) {
        if(nums.size()==1) return nums[0];
        int len = nums.size()-1;
        int start=0, end=len;
        while(start<=end) {
            int mid = start + (end-start)/2;
            //如果mid值大於當前範圍的最後一個數,則最小值應當在右側.
            if(nums[mid]>nums[end]) start = mid+1;
            //如果小於.
            else if(nums[mid]<nums[end]) {
                //如果mid爲0或者前一個數大於後一個數,則直接返回mid值.
                if(mid==0 || nums[mid-1]>nums[mid]) return nums[mid];
                //否則最小值在左側.
                else end = mid-1;
            }
            //如果mid值和end值相等.
            else {
                //如果mid==end, 說明當前只剩下一個值,一定是最小的.
                if(mid==end) return nums[mid];
                //否則類似[1,1,1,0,1]或[1,0,1,1,1]這種形式,沒辦法判斷0在mid左邊
                //還是右邊,此時令end=end-1. 因爲如果nums[end]爲最小值,則
                //nums[mid]==nums[end],nums[mid]也是最小值,end-1不影響.
                end = end-1;
            }
        }
        return -1;
    }
};

發佈了95 篇原創文章 · 獲贊 26 · 訪問量 2133
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章