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

二分,注意边界

其实就是数组有两部分,都是升序的,左边部分都比右边部分大,暂且称左序列和右序列

所以当 left 指向的元素比 mid 值小,说明是指向了左序列,左指针右移,left=mid

当 right 指向的元素比 mid 的大, 说明是指向了右序列,右指针左移, right = mid

这样向中间靠,当左右指针相邻的时候退出循环,2个值小的那个就是答案

还有一种偷鸡法,直接找最小值

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        if(rotateArray.size() == 0){
            return 0;
        }
        int left, right, mid;
        left = 0, right = rotateArray.size() - 1;
        while(right - left != 1){
            mid = (left + right) / 2;
            if(rotateArray[mid] >= rotateArray[left]){
                left = mid;
            }
            if(rotateArray[mid] <= rotateArray[right]){
                right = mid;
            }
        }
        return min(rotateArray[left], rotateArray[right]);
    }
};
View Code

 

posted @ 2017-10-13 11:48  Deaglepc  阅读(192)  评论(0编辑  收藏  举报