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