题目描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
注意数组中可能存在重复的元素。
示例 1:
输入: [1,3,5]
输出: 1
示例 2:
输入: [2,2,2,0,1]
输出: 0
code
- 二分法
- 同:剑指offer-旋转数组的最小值I
class Solution {
public:
int findMin(vector<int>& numbers) {
int left=0;
int right=numbers.size()-1;
while(left<=right){
int mid=left+((right-left)>>1);
if(numbers[mid]<numbers[right]){//右边比中间大,右边一定是有序数组
right=mid;
}
else if(numbers[mid]>numbers[right]){
left=mid+1;
}
else {
right--;//右边和中间值相等,缩短有边界
}
}
return numbers[left];
}
};