1. 题目情况就是打印最小的,突破点在于有效利用特性,该组的特性就是将前面的序列移动至末端,且分割后两个序列都是递增的。所以优化方案又是咱们熟悉的二分法(钠喊:万物皆可二分)
2.源代码(只在第一次使用了二分思想,是可以再优化的)
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int n=rotateArray.size();
int mid=(n-1)/2,dex=0,target=0;
if( rotateArray[mid] >= rotateArray[0])
{
dex=mid++;
for(;dex<n;dex++)
{
if(rotateArray[dex+1]<rotateArray[dex])
target= rotateArray[dex+1];
}
}
else{
dex=mid--;
for(;dex>0;dex--)
{
if(rotateArray[dex-1]>rotateArray[dex])
target= rotateArray[dex];
}
}
return target;
}
};
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
//先判空
if(rotateArray.empty())
return 0;
int low = 0;//左端
int hight = rotateArray.size() - 1;//右端
int mid = 0;//中间
while(low < hight){//如果左端<右端则正常
mid = low + (hight - low)/2;
if(rotateArray[mid] >= rotateArray[hight])
//如果中间值大于右端,说明当前位于左递增序列,则目标在右边
//左端=mid+1
low =mid +1;
else
//说明在左端,右端为mid
//之后进入while循环 不断向目标二分靠拢 到最后左端等于右端时就找到了
hight = mid;
}
return rotateArray[hight];
}
};