剑指Offer-旋转数组的最小数字(简单)
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [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]; } };