局部最小存在的几种情况,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; } };