一个数组,一部分升序,后一部分降序,求巅峰元素位置
关键思路:巅峰元素位置比左右两边元素都小,利用有序特性,进行二分查找
1.取数组中间位置元素,如果它比它两边的元素都大,那么它就是我们要找的
2.如果它比左边大,比右边小,说明这个元素还在升序数组里,在mid~high元素中继续按照本方法寻找
3.在low~mid中寻找
实现如下
#include <iostream>
using namespace std;
int findpeak(int *data,int length) //非递归实现
{
int low,high,mid;
low=0;
high=length-1;
while(1)
{
mid=(low+high)/2;
if(data[mid]>data[mid+1]&data[mid]>data[mid-1])
break;
if(data[mid]>data[mid-1]&&data[mid]<data[mid+1])
{
low=mid;
continue;
}
high=mid;
}
return mid;
}
int find(int *data ,int low,int high) //递归实现
{
int mid=(low+high)/2;
if(data[mid]>data[mid+1]&data[mid]>data[mid-1])
return mid;
if(data[mid]>data[mid-1]&&data[mid]<data[mid+1])
return find(data,mid,high);
else return find(data,low,mid);
}
int main()
{
int length;
cin>>length;
int *data=new int[length];
for(int i=0;i<length;i++)
cin>>data[i];
//cout<<"巅峰位置在"<<data[findpeak(data,length)]<<endl;
cout<<"巅峰位置在"<<data[find(data,0,length-1)]<<endl;
}