题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:
法一:输入的是非递减数组的旋转,顺序遍历,当a[i]>a[i+1]时,a[i+1]为最小元素 ,时间复杂度O(n);
法二:二分查找的变种,旋转数组头尾各一指针l,h,中间元素指针mid,如果*l大与*mid,则前半段递增,l=min;
法一:
1 class Solution { 2 public: 3 int minNumberInRotateArray(vector<int> rotateArray) { 4 if(rotateArray.empty()) 5 return 0; 6 7 for(int i=0;i<rotateArray.size()-1;i++) 8 { 9 if(rotateArray[i]>rotateArray[i+1]) 10 return rotateArray[i+1]; 11 } 12 return rotateArray[0]; 13 } 14 };
法二:
1 //二分 2 class Solution { 3 public: 4 int minNumberInRotateArray(vector<int> rotateArray) { 5 if(rotateArray.empty()) 6 return 0; 7 int low=0; int high=rotateArray.size()-1; 8 9 while(low<high) 10 { 11 int mid=low+(high-low)/2; 12 if(rotateArray[mid]>rotateArray[high]) 13 low=mid+1; 14 else 15 high=mid; 16 } 17 return rotateArray[low]; 18 } 19 };