局部最小值(二分)



局部最小存在的幾種情況,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;
    }
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM