leetcode 153, 154 旋转数组最小值问题

第一件要明确的事,咱们要找的元素肯定在右半部分,当然可能不存在左半部分。这样一来,我们希望在二分的时候,如果只有右半部分,也能求出最终解,这就需要我们必须和右端的元素进行比较。如果和左边比较,当我们完全进入右半部分时,指针根本处理不了这种情况。

第二件事就是,当mid和r处元素相等时,要r–。这个基本可以当成结论来看了,由于无法判断,只能退化成O(N)。这是一种无奈的妥协。

两个题代码分别如下:

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

你可能感兴趣的:(二分查找)