【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 + 1
或right = mid
。