题目:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路分析:
普通做法直接用排序的思路O(n),但是这道题有高效的做法,就是旋转之后数组其实是由两个有序数组排列,因此可以采用二分实现高效率!
1、仔细观察旋转之后的规律,最小值就在跳接处。还有需要考虑特别情况!
2、存在旋转0个元素,也就是不旋转,这个时候数组最小就是第一个元素
3、还有另外就是数组所有元素都相等,那么这个时候也返回第一个元素
如果是旋转的话最终退出条件就是两个指针差值为1,也就是跳接处!
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.empty())
return 0;
int low=0;
int height = rotateArray.size()-1;
int indexMid=low;//初始化为最低值是如果是0旋转就直接返回第一个元素
while(rotateArray[low]>=rotateArray[height]){//有旋转
if(height-low==1)
{
indexMid=height;
break;
}
indexMid=low+(height-low)/2;
if(rotateArray[low]==rotateArray[height]&&rotateArray[low]==rotateArray[indexMid])//数组元素全等处理
{
break;
}
if(rotateArray[indexMid]>=rotateArray[low])
low=indexMid;
else if(rotateArray[indexMid]<=rotateArray[height])
height=indexMid;
}
return rotateArray[indexMid];
}