#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]; } };
分四种情况讨论