局部最小
问题:
给定无序数组arr,已知arr中任意两个相邻的数都不相等,写一个函数,只需返回arr中任
意一个局部最小出现的位置即可。
思路:
1、arr长度为1时,arr[0]是局部最小。
arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小;
2、如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;
3、如果0<i<N-1,既有arr[i]<arr[i-1]又有arr[i]<arr[i+1],那么arr[i]是局部最小。
代码:
// O(lgN)方法
int getLocalValue2(int *arr, int n){
if(n == 1 || arr[0] < arr[1]) return arr[0];
if(arr[n-1] < arr[n-2]) return arr[n-1];
int beg = 1, end = n-2;
int mid=0;
while(beg <= end){
int mid = (beg+end)>>2;
if(arr[mid-1] < arr[mid])end = mid-1;
else if(arr[mid+1] < arr[mid])beg = mid+1;
else return mid;
}
return beg;
}