一个给定的不包含相同元素的整数数组,每个,局部极小值的定义是一个值比左右相邻的(如果存在)都小的值,求它的一个局部最小值
遍历数组 O(n)时间复杂度。
二分查找 O(logn)时间复杂度:
数组范围是 [0,n-1],因此假想在下标-1和n处有两个取值为无穷大的哨兵。
mid = (x + y) / 2,二分,两个子数组a[x..mid], a[mid + 1..y]
若a[mid] < a[mid + 1], 则子数组a[x..mid]满足a[x] < a[x - 1], a[mid] < a[mid + 1]
反之a[mid] > a[mid + 1], 则子数组a[mid + 1..y]满足a[mid + 1] < a[mid], a[y] < a[y + 1]
实现:
int findLocalMax(const vector<int> &v)
{
int lo = 0,hi = v.size()-1;
while(lo<hi)
{
int mid = (lo+hi)>>1;//由于整数除法 其实是向下取整
if(v[mid]>v[mid+1]){
lo = mid+1;
}else{
hi = mid;
}
}
return lo; //跳出循环 lo 一定等于 hi
}