问题:
给定数组A[1...n],满足:n>=3, A[1]>=A[2], A[n] >= A[n-1]。
若A[i]为波谷,则:A[i-1] >= A[i] <= A[i+1]。
请在O(logN)时间内,找到数组中的一个波谷。
分析:
根据数据数组的两端的情况,可知:整个区间必存在波谷。
要求O(logN),首先想到二分:
设区间为【left,right】,满足left>= left+1, right >= right-1。
设mid = (left + right) / 2。
那么:
1)若A[mid-1] < A[mid], 则【left,mid】必存在波谷。
2)若A[mid] <A[mid+1],则【mid,right】必存在波谷。
3)若1)、2)均不满足,则mid必为波谷。
故,很容易二分。
代码1:递归实现
int FindTrough(const vector<int> &v, int s, int t){
int mid = (s + t) >> 1;
if(v[mid -1] < v[mid])
return FindTrough(v, s, mid);
else if(v[mid] > v[mid + 1])
return FindTrough(v, mid, t);
return mid;
}
代码2:非递归实现
int FindTrough(const vector<int> &v){
int left = 0, r