把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
本题使用常规的遍历搜索复杂度为O(n),如果使用二分法效率有可能更高(本题套用二分法模板不一定会有log2 n,但可能会遇到有利的输入条件从而达到log2 n),课本上的二分法查找一个递增序列的某个元素是基础的形式(算法复杂度为log2 n),也是二分法标准格式的一个特例,标准的二分法模板
while循环内部固定的三个if语句以及比较结果的//update left or right本质都要缩小范围,即增大left,减小right,缩小范围的前提依据是符合题意靠近结果趋势
1 while(left < right){ 2 mid = (left+right)/2; 3 if(array[mid] < array[right]){ 4 //update left or right 5 } 6 else if(array[mid] > array[right]){ 7 //update left or right 8 } 9 else{ 10 //update left or right 11 } 12 } 13 //left == right 14 return array[left];
本题的代码:
1 class Solution { 2 public: 3 int minNumberInRotateArray(vector<int> rotateArray) { 4 int left = 0,right = rotateArray.size()-1; 5 int mid = 0; 6 while(left < right){ 7 mid = (left+right)/2; 8 if(rotateArray[mid] < rotateArray[right]){ 9 right = mid; 10 } 11 else if(rotateArray[mid] > rotateArray[right]){ 12 left = mid + 1; 13 } 14 else{ 15 right--; 16 } 17 } 18 return rotateArray[left]; 19 } 20 };