算法设计实验一单峰序列

  问题描述

给定含有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);
        
    }

}
 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值