旋转数组的最小数字
问题描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路:
一定的有序数组查找,首先采用二分,数组数据的分布为下图所示,找旋转数组的最小值,即找中间那条垂直线
1、满足第一个if的点在竖直线右侧,且二分的端点在竖直线两侧
2、满足第二个if的点在竖直线左侧,且二分的端点在竖直线两侧
3、满足第三个if的点说明二分的端点在同一侧
这里,如果没有旋转的话,整个数组是有序的,那么,始终会进入第3个if,即成为二分查找。
代码:
1 class Solution { 2 public: 3 int minNumberInRotateArray(vector<int> rotateArray) { 4 int l = 0; 5 int h = rotateArray.size() - 1; 6 return findmin(rotateArray,l,h); 7 } 8 int findmin(vector<int> rotateArray,int l,int h) 9 { 10 while(1) 11 { 12 int m = (l + h) / 2; 13 if(rotateArray[m] <= rotateArray[l] && rotateArray[m] <= rotateArray[h]) 14 { 15 h = m; 16 } 17 if(rotateArray[m] >= rotateArray[l] && rotateArray[m] >= rotateArray[h]) 18 { 19 l = m; 20 } 21 if(rotateArray[m] >= rotateArray[l] && rotateArray[m] <= rotateArray[h]) 22 { 23 h = m; 24 } 25 if(l + 1 == h) 26 { 27 return (rotateArray[l] < rotateArray[h])?rotateArray[l] : rotateArray[h]; 28 break; 29 } 30 } 31 32 } 33 };