把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:
二分查找的变换,也是利用二分查找缩小范围的特性。两个下标分别指向数组第一个元素和最后一个元素。找中间元素和第一个 元素和最后一个元素比较大小,如果中间元素大于等于第一个元素,则中间元素在第一个有序序列中,则把index1移向中间下标。如果中间元素小于等于最后一个元素,则中间元素在第二个有序序列中,则把index2移向中间下标。直到index2-index1==1时 才结束。此时index2指向的元素为最小元素。
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int index1=0;
int index2=rotateArray.size()-1;
int indexmid=index1;
while(rotateArray[index1]>=rotateArray[index2])
{
if(rotateArray[index1]==rotateArray[indexmid]&&rotateArray[index2]==rotateArray[indexmid])//前中后值相同,则顺序遍历
{
int result=rotateArray[0];
for(int i=index1+1;i<=index2;i++)
{
if(result>rotateArray[i])
result=rotateArray[i];
}
return result;
}
indexmid=(index1+index2)/2;
if(index2-index1==1)
{
indexmid=index2;
break;
}
if(rotateArray[indexmid]>=rotateArray[index1])
index1=indexmid;
else if(rotateArray[indexmid]<=rotateArray[index2])
index2=indexmid;
}
return rotateArray[indexmid];
}
};