思路:采用二分查找,分这几种情况。
1. 保证旋转数组(a[low]>=a[high]),若不保证,则没有旋转,是单调递增的,直接输出第一个数;否则下面几种情况;
2. 只剩两个数,第二个肯定最小;
3. a[low]=a[mid]=a[high],如[1,1,1,0,1],最小值不好判断,只能挨个找,因为a[low]>=a[high],所以让low++;
4. a[mid]>=a[low],如[3,4,5,1,2],最小值在右边;
5. a[mid]<=a[high],如[4,1,2,3,4],最小值在左边。
class Solution {
public:
int minNumberInRotateArray(vector<int> a) {
int len = a.size();
if(len==0)
return 0;
int l=0,r=len-1;
while(a[l]>=a[r])
{
if(r-l==1)
{
return a[r];
}
int mid = l+(r-l)/2;
if(a[l]==a[r]&&a[l]==a[mid])
{
l--;
}
else if(a[mid]>=a[l])
{
l=mid;
}
else if(a[mid]<=a[r])
{
r=mid;
}
}
return a[l];
}
};