【LeetCode-153】寻找旋转排序数组中的最小值

问题

假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] 。

请找出其中最小的元素。

示例

输入:nums = [3,4,5,1,2]
输出:1

输入:nums = [4,5,6,7,0,1,2]
输出:0

解答

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

重点思路

采用二分算法保证时间复杂度为O(log(N))。
二分算法的重难点是判断left和right哪个应该与mid相等。我们可以把二分算法的两个区间分别看作“正常数组”与“反常数组”,其中,“正常数组”中存在我们需要的值,我们要保证每次移动左右区间时,都不跳离“正常数组”,且不跳进“反常数组”。在本题中,当左边的值大于右边的值时,最小值必定在该区间内,并且不可能为左边的值。根据这一判断,我们可以得到判断条件为:nums[mid] > nums[right],具体操作为left = mid + 1right = mid

posted @ 2021-02-15 17:59  tmpUser  阅读(20)  评论(0编辑  收藏  举报