剑指offer 旋转数组的最小数字

题目传送

剑指offer 旋转数组的最小数字_第1张图片
暴力跑和二分。

这里的二分需要思考一下,
他虽然打乱了顺序,但是一样的可以二分。

有三种情况:

情况1,arr[mid] > arr[r]:4 5 6 1 2 3
arr[mid] 为 6, arr[r]为右端点 3
都是这种类似的情况,最小值的区间一定在[mid,r]

情况2,arr[mid] < arr[r]:5 6 1 2 3 4
arr[mid] 为 1, arr[r]为右端点 4
同理,最小值的区间一定在[l,mid]

情况3,arr[mid] == arr[r]:
如果是 1 0 1 1 1, arr[mid] = arr[r]= 1, 显然答案在左边
如果是 1 1 1 0 1, arr[mid] = arr[r]= 1, 显然答案在右边

所以这种情况,不能确定答案在左边还是右边,那么就让r= r- 1,慢慢缩少区间,同时也不会错过答案。

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        int l = 0,r = rotateArray.size()-1;
        while(l < r){
            int mid = (l+r)/2;
            if(rotateArray[mid] < rotateArray[r]){
                r = mid;
            }
            else if(rotateArray[mid] > rotateArray[r]){
                l = mid+1;
            }
            else{
                r--;
            }
        }
        return rotateArray[l];
    }
};

你可能感兴趣的:(剑指offer,算法)