题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
方法(1):直接遍历,找到最小值。
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int length=rotateArray.size();
if (length==0)
return 0;
int min = rotateArray[0];
for (int i=1;i<length;i++)
{
if (rotateArray[i]<min)
{
min=rotateArray[i];
}
}
return min;
}
};
方法(2)利用二分查找。如果中间元素值>最后一个元素值,说明最小值右半区间,如果中间元素<最后一个元素区间,说明最小值在左半区间,如果相等说明有相同元素,需要将判断区间往前缩一下,继续判断,不断循环,当二分查找的的左右区间相等了,就说明找到最小值了。
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int length=rotateArray.size();
if (length==0)
return 0;
int left=0;
int right=length-1;
while(left<right)
{
int mid=left+(right-left)/2;
if (rotateArray[mid]>rotateArray[right])
{
left=mid+1;
}
else if (rotateArray[mid]<rotateArray[right])
{
right=mid;
}
else
right=right-1;
}
return rotateArray[left];
}
};