LeetCode 153 Find Minimum in Rotated Sorted Array

310 阅读1分钟

LeetCode 153 Find Minimum in Rotated Sorted Array

思路

二分查找,通过left,mid,right指向元素之间的关系改变搜索区间。对于一个递增的序列,有nums[left] < nums[mid] < nums[right],那么,我们考虑不满足递增序列的情况下,该如何改变搜索区间。如果nums[mid] < nums[left],说明最小值在[left, mid]之间,可以将搜索区间更改为[left + 1, mid]。如果nums[mid] > nums[right],说明最小值在[mid, right]之间,可以把区间更改为[mid+1, right]。while循环条件为left < right,也就是当left和right指向同一个元素的时候,退出。有一些题是使用二分查找,找到数组中元素值等于target,这时的退出条件应该是left <= right,因为要检查当left和right指向同一个元素的值是否等于target。

这里的解法一先和left比较,后和right比较。解法二的思路和解法一想通,只不过,是只和right比较。

代码

解法一

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

解法二

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