题目链接
这一题有一个细节要注意,必须比较最右边的端点,否则 mid 的元素值和 right 的元素值相等的时候不好缩小区间。因为当right > left 的时候 mid 的值是肯定小于 right 的,这样right–才能保证不会缩过头了,因为right前面至少有一个还能满足要求就是mid, 可以大胆的往前缩。
class Solution {
public:
int minArray(vector<int>& numbers) {
int left = 0, right = numbers.size()-1;
while(left<right){
int mid = left + (right-left)/2;
if(numbers[mid]<numbers[right]){
right = mid;
}
else if(numbers[mid]>numbers[right]){
left = mid+1;
}
else{
right -= 1;
}
}
return numbers[left];
}
};