leecode[三]

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

在這裏插入圖片描述
思路一:
比較暴力的求解,找到翻轉的點(由升序變爲降序),有找到這個點,則就是下一個點就是。沒有找到這個點,就是第一個點。

class Solution {
public:
    int findMin(vector<int>& nums) {
        int size = nums.size();
        int i,tmp;
        if(size==1){
            return nums[0];    
        }
        
        for(i=1,tmp=nums[0];i<size;i++){
            if(nums[i]<tmp){
                break;
            }
            tmp=nums[i];
        }
        if(i!=size){
            return nums[i];
        }else{
            return nums[0];
        }
        
    }
};

思路二:
我們需要知道,對於一個區間A,如果A[start] < A[stop],那麼該區間一定是有 序的了。
另外,由於不含重複元素,需要分兩種情況。
對於一個輪轉了的排序了的數組,
如果nums[mid]>nums[left],最小值一定在右半區間
如果nums[mid]<nums[left],最小值一定在左半區間

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

static const auto __lamda = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章