新手讲算法 旋转数组中最小的数

//分析:非递减排序数组 前面一部分 挪到后面,则形成了 两个非递减排序的数组,
//而:最小的元素一定出现在 第二个非递减排序的数组中
//所以这个题:我们要找出 两个非递减的边界,当 end - start == 1时,条件中指,end就是找到的元素
//(1)我们用两个指针,第一个指针,指向 第一个元素 start , 第二个指针 指向 最后一个元素 end。找到 中间的元素 mid
//(2) mid == start && mid == end。 则无法分辨 最小数,在前面还是在后面,则我们遍历 start—>end 去找
//(2) mid >= start, 则说明 mid 处在第一个 递减数组中,则 最小数 在 mid 之后,此时范围 mid->end
//(3)mid <= end, 说明 mid 处在第二个递减数组中, 则 最小数 在 mid 之前,此时范围: start -> end

class Solution {
public:
    int minNumberInRotateArray(vector<int> a) {
        int start = 0;
        int end = a.size() - 1;
        int mid = (start + end) / 2;
        while( a[end] <= a[start]) {
            if(end - start == 1) {
                return a[end];
            }
            mid = (start + end) / 2;
            if(a[mid] == a[start] && a[mid] == a[end]) {
                int min = a[start];
                for(int i = start; i <= end; i++) {
                     if(a[i] < min) {
                         min = a[i];
                     }
                }
                return min;
            }
            if(a[mid] >= a[start]) {
                //说明mid在第一个数组中
                start = mid;
            } else {
                end = mid;
            }
        }
        return 0;
    }
};

  

posted @ 2018-04-01 21:38  jiguojing  阅读(105)  评论(0编辑  收藏  举报