#include <algorithm>
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
//使用左闭右闭区间
int L=0;
int R=rotateArray.size()-1;
int mid=L+(R-L)/2;
while(L<R)
{
//情况1,元素直接成非严格递增排列
if(rotateArray[L]<rotateArray[R])
{
R=L;
continue;
}
//情况2,如果mid和边缘两值相等,此时无法判断左右需要移动R,(R移动的特点是,下次收缩时不会直接排除R)
if(rotateArray[mid]==rotateArray[R]&&rotateArray[R]==rotateArray[L])
{
--R;
mid=L+(R-L)/2;
continue;
}
//如果rotateArray[mid]>=rotateArray[L],最小值在mid右边,不含mid,
if(rotateArray[mid]>=rotateArray[L])
{
L=mid+1;
mid=L+(R-L)/2;
continue;
}
//如果rotateArray[mid]<=rotateArray[L],最小值在mid左边,可能是mid
if(rotateArray[mid]<=rotateArray[R])
{
R=mid;
mid=L+(R-L)/2;
continue;
}
}
//返回最后的结果
return rotateArray[R];
}
};
分四种情况讨论



京公网安备 11010502036488号