问题描述
给定含有n个不同整数的数组L=<a1,a2,......,an>,如果L中存在ai,使得a1<a2<......<ai-1<ai>ai+1>…>an。则称L是单峰的,并称ai是L的“峰顶”。假设L是单峰的,设计一个算法,找L的峰顶。
输入形式
一共包括两行,第一行一个整数N,表示数组中整数的个数。
接下来的一行中包含N个整数,以空格分隔
输出形式
如果这些整数中存在峰顶元素ai,则输出该元素的下标i,否则输出0
样例输入
9
1 2 5 7 9 8 6 4 3
样例输出
5
另一组样例:
输入:
9
3 5 6 2 9 8 7 4 1
输出:0
网上的那些答案我真是不想吐槽了,我就没找到个正确的,还得靠自己
可怕的是老师给的模板都是错的,我也是醉了
写一下,梳理一下思路
主要思想是二分和递归
二分有三种情况
1.找到一个点,大于他旁边的两个点,接着我们要确定一下,该点的左边是不是上坡,右边是不是下坡
2.找到一个点,左边的》该点》右边的,说明在上坡,向右找山峰
3.找到一个点,左边的《该点《右边的,说明在下坡,向左找山峰
二分查找
import java.util.Scanner;
public class 单峰序列 {
static int n;
static int a[];
static int find(int start,int end){
if(start==end-1) return -1;
int mid=(start+end)/2;
if(a[mid-1]<a[mid]&&a[mid]<a[mid+1]) //上坡
return find(mid,end);//right向右找
else if(a[mid-1]>a[mid]&&a[mid]>a[mid+1]) //下坡
return find(start,mid);//left向左找
else if(a[mid-1]<a[mid]&&a[mid]>a[mid+1]){
if(find(start,mid)<0&&find(mid,end)<0)//判断是否是上下坡,如果不是纯正的上下坡,那就没有解
return mid-1;//返回下标
else return -1;
}
else return 0;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
a=new int[n+1];
for(int i=1;i<=n;i++){
a[i]=sc.nextInt();
}
System.out.println(find(1,n)+1);
}
}