1、首先想到是排序后再查找;
这个想法肯定对,但是效率十分低下;
2、二分查找的方法;找到中间的值与两侧的值对比;
思路:
while(left<right)的循环内;
- 如果a[mid]>[right];说明左侧一直是递增的,在右侧 更新left=mid+1;
- 如果a[mid]==a[right];这个情况就比较复杂了;
-
- 有可能全部都相等;
- 有可能右侧全部都相等;
- 有可能右侧的某一点之后不变了;并且和左侧的值全部都相等
- 所以这个时候 判断right的前一点即可;
- right=right-1;
- 如果a[mid]<a[right]
- 说明这个最小值可能在左侧;
- right=mid;
class Solution {
public:
int minNumberInRotateArray(vector<int> a)
{
int n=a.size();
if(n==0)
return 0;
int left=0;
int right=n-1;
int mid;
while(left<right)
{
mid=(left+right)/2;
if(a[mid]<a[right])
right=mid;
else if(a[mid]==a[right])//a[right]==a[mid]这个情况比较复杂;可能全部相等,左边全部相等,右边全部相等;需要特殊分析’
right=right-1;
else if(a[mid]>a[right])
left=mid+1;
}
return a[right];
}
};