题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
二分法,比较mid和右边界的关系,大于时表示最小值肯定在右边,小于时则在左边或者当前位置。
由于可能有重复数字,所以当mid和右边界重复时候,压缩范围,将右边界减1
class Solution {
public:
int minArray(vector<int>& numbers) {
int left=0,right=numbers.size()-1;
int mid;
while(left<right){
mid=left+(right-left)/2;
if(numbers[mid]==numbers[right]) right--;//相等时右边界左移,压缩范围
else if(numbers[mid]>numbers[right]) left=mid+1;//大于时肯定不等于,所以mid+1作为左边界
else right=mid;//小于时有可能等于,mid-1作为右边界
}
return numbers[left];
}
};
京公网安备 11010502036488号