题目描述:一 个数组A[1..n],假设数组中没有任何相邻两数相等,满足A[1]<A[2],A[n-1]>A[n]。A[i]被称为波峰,当且仅当 A[i]>A[i-1]并且A[i]>A[i+1]。请找到数组中的一个波峰。假设数组中存在相邻相等的数,该怎么做?
二分法寻找一个波峰,
如果数组存在相邻相等的元素则必须O(n)
1 /************************************************************************* 2 > File Name: ArrayWaveCrest.cpp 3 > Author: zhoukang1991 4 > Mail: zhoukang199191@126.com 5 > Created Time: 2014年08月29日 星期五 21时36分24秒 6 ************************************************************************/ 7 8 #include <iostream> 9 #include <vector> 10 #include <climits> 11 using namespace std; 12 13 int findcrest(const vector<int> &arr){ 14 int left = 0; 15 int right = arr.size()-1; 16 int n = arr.size(); 17 while(left <= right){ 18 int mid = left + (right-left)>>1; 19 if(mid == 0){ 20 left = 1; 21 continue; 22 } 23 if(mid == n-1){ 24 right = n-2; 25 continue; 26 } 27 28 if( arr[mid] > arr[mid-1] && arr[mid] > arr[mid+1]){ 29 return arr[mid]; 30 } 31 else if(arr[mid] < arr[mid-1]){ 32 right = mid-1; 33 } 34 else{ 35 left = mid+1; 36 } 37 } 38 return INT_MIN; 39 } 40 41 int main(){ 42 vector<int> v; 43 v.push_back(1); 44 v.push_back(2); 45 v.push_back(3); 46 v.push_back(2); 47 v.push_back(1); 48 cout<<findcrest(v)<<endl; 49 return 0; 50 }