题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
题目分析:这个题有一种方法特别简单,因为原来就是一个非递减序列,当旋转后,要找到最小元素,其实就是从头遍历碰到了当前位置数大于后位置数,那么后位置数肯定是最小数。但是这样的时间复杂度是O(n),为了寻求更高效的方法就是使用二分查找。这样事件复杂度只有O(logn)。
C++代码: class Solution { public: int minNumberInRotateArray(vector<int> arr) { /*时间复杂度O(n) int size=rotateArray.size(); if(size==0) return 0; for(int i=0;i<size;++i) { if(rotateArray[i]>rotateArray[i+1]) { return rotateArray[i+1]; } } return rotateArray[0]; } */ //利用二分法时间复杂度O(nlogn) if(arr.size()==0) return 0; int high=arr.size()-1; int low=0; while(low<high) { int mid=(high-low)/2+low; if(arr[mid]>arr[high]) { low=mid+1; } else if(arr[mid]==arr[high]) //这里是要注意当出现111110001类似情况 { high=high-1; //只能从后往前依此比较 } else high=mid; } return arr[low]; } };