第三十六题 看到logn 就应该想到用二分法 找到变化的位置 也就是最小值
那么判断条件是什么? 就看middle和最右边谁大 如果说middle比右边大,
1.假设数组是这样:456123 middle是6 right是3 那么显然 变化的值在右边middle和right中间
2.假设是412345 middle是2 right是5 说明右侧是正常的递增数列 所以变化的值必定在middle左边
3.假设是65412344 middle是4,right也是4,说明答案在middle和right中间,但因为中间不知道什么位置是旋转的地方,此时不能用二分法来找,只能让右边减一,再进入循环继续判断
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
// 二分法
int left=0,right=rotateArray.size()-1;
int middle=0;
while(left<right){
middle=(left+right)/2;
// 如果中间的值比右边的大 则答案在右边
if(rotateArray[middle] > rotateArray[right] )
left=middle+1;
// 如果中间的值比右边小 则答案在左边
else if(rotateArray[middle] < rotateArray[right])
right=middle;
// 如果和最右边一样 答案在middle和right中间 继续只能缩小right--
else
right--;
}
return rotateArray[left];
}
};
public:
int minNumberInRotateArray(vector<int> rotateArray) {
// 二分法
int left=0,right=rotateArray.size()-1;
int middle=0;
while(left<right){
middle=(left+right)/2;
// 如果中间的值比右边的大 则答案在右边
if(rotateArray[middle] > rotateArray[right] )
left=middle+1;
// 如果中间的值比右边小 则答案在左边
else if(rotateArray[middle] < rotateArray[right])
right=middle;
// 如果和最右边一样 答案在middle和right中间 继续只能缩小right--
else
right--;
}
return rotateArray[left];
}
};