这里的思路很简单,就是二分:
[left,right]为当前区间,mid是中间数字的索引
如果num[mid]>num[right],说明最小数字在[mid+1,right]
如果num[mid]<num[right],说明最小数字在[left,mid]
如果是相等,right--,这是为了处理一些重复出现的元素的情况比如[0,1,1,1]旋转成[1,1,0,1]
代码如下所示,还有一些细节错误方面的处理:
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int left=0,right=rotateArray.size()-1;
while(left<right){
int mid=left+((right-left)>>1);
if(rotateArray[mid]>rotateArray[right]){
left=mid+1;
}else if(rotateArray[mid]<rotateArray[right]){
right=mid;
}else{
right--;
}
}
// return rotateArray[right];
return rotateArray[left];
}
};
之前过了少数的样例:
1.第一个判断写成>rotateArray[left]出错
2.返回rotateArray[left]出错