问题:求被旋转了的排序数列中的最小值。
Example 1: Input: [3,4,5,1,2] Output: 1 Example 2: Input: [4,5,6,7,0,1,2] Output: 0
方法:二分法查找
low=0,high=end index
mid=low和high的中间值
如果mid的数值>low的数值,则要求的最小值一定在mid~high之间(因为求最小值,不包含mid),那么下一次循环查找范围在mid~high之间,即让low=mid+1
反之如果mid<low的数值,则要求的最小值一定在low~mid之间(因为求最小值,包含mid),那么下一次循环查找范围在low~mid之间,即让high=mid
特:当low的值<high的值,那么low到high是顺序的,low为最小值,那么直接返回low。
参考代码:
1 class Solution { 2 public: 3 int findMin(vector<int>& nums) { 4 int low = 0, high = nums.size()-1; 5 while(low<high){ 6 int mid = (low+high)/2; 7 if(nums[low]<nums[high]) 8 return nums[low]; 9 if(nums[mid]>=nums[low]){ 10 low=mid+1; 11 }else if(nums[mid]<=nums[high]){ 12 high=mid; 13 } 14 } 15 return nums[low]; 16 } 17 };