局部最小值(二分)


局部最小存在的几种情况,1. 长度为1,arr[0]就是局部最小;2. 数组的开头,如果arr[0] < arr[1] ,arr[0]被定义为局部最小。 3. 数组的结尾,如果arr[N-1] < arr[N-2] ,arr[N-1]被定义为局部最小。 所以剩下就是数组下标1~N-2之间的了。再按arr[i-1] < arr[i] <arr[i+1] 找到一个局部最小。题目最后要求返回任意一个。假如你顺序的去搜索,去找一个比左小比右小的数,那么你的时间复杂度为O(N),比如单调递减的数组,搜索到最后一个。使用二分搜索,就能达到O(logN);好像这道题,你如果直接搜索得到的答案是不对的,是不是标准答案的结构就是要你二分搜索,否则任意一个局部最小,答案也不止一个。

class Solution {
public:
    int getLessIndex(vector<int> arr) {
        int len = arr.size();
        //特殊情况
        if(len == 0) return -1;
        if(len == 1 || arr[0] < arr[1]) return 0;
        if(arr[len-1] < arr[len-2]) return len-1;
        //1 --- len-2 局部最小其中  arr[0] > { arr[1]    arr[len-2] } < arr[len-1]
        //二分 {arr[left]...arr[mid-1]} arr[mid]  {arr[mid+1]...arr[right]}
        int left = 1,right = len-2;
        while(left <= right){
            int mid = left + (right-left)/2;
            if(arr[mid-1] < arr[mid]) right = mid-1;
            else if(arr[mid+1] < arr[mid]) left = mid+1;
            else return mid;
        }
        //left > right 正常不会到这。
        return 0;
    }
};
原文地址:https://www.cnblogs.com/wsw-seu/p/13660890.html