题目地址
https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/
题目描述: 寻找旋转排序数组中的最小值
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
你可以假设数组中不存在重复元素。
示例:
示例 1:
输入: [3,4,5,1,2]
输出: 1
例 2:
输入: [4,5,6,7,0,1,2]
输出: 0
解答
方法一:循环遍历找到最小值。
运行时间为线性,但是这么做没有任何意义。
方法二:二分。
若发生旋转:当 num[middle] >= nums[left] 时候,左侧一定有序递增,因此最小值在右侧;否则,右侧一定是有序递增,最小值在左侧。
class Solution {
public:
int findMin(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while( left < right){ //不存在重复元素
int middle = left + (right - left)/2;
if( nums[left] < nums[right]) //有序
right = middle;
else{
if( nums[left] <= nums[middle]) //左侧有序,右侧无序
left = middle + 1;
else //左侧无序,右侧有序
right = middle;
}
}
return nums[left];
}
};