1. 程式人生 > >【演算法】單峰序列

【演算法】單峰序列

單峰序列

      問題描述

給定含有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

解題思路:

用二分法將序列一分為二,假設一個小的分段只有三個數值,比較這三個數的大小,來決定左右界的調整。同時要注意符合要求的這個分組左右邊的其他分組是否符合要求,若不符合則當前分組也不符合要求。

#include<iostream> 
using namespace std;
int Summit(int l[],int left,int right){
	if(left+1==right) return -1;
	int middle = (left + right+1)/2;
	if( ( l[middle-1]<l[middle] ) && ( l[middle]<l[middle+1] ) )
		return Summit(l,middle,right);
	else if( ( l[middle-1]>l[middle] ) && ( l[middle]>l[middle+1] ) )
		return Summit(l,left,middle);
	else if( ( l[middle-1]<l[middle] ) && ( l[middle]>l[middle+1] ) )
		if(Summit(l,left,middle)<0 && Summit(l,middle,right)<0 )
			return middle;
		else return -1;
	else return -1;
}
int main(){
	int N,L[20];
	cin>>N;
	for(int i=0;i<N;i++)
		cin>>L[i];
	cout<<Summit(L,0,N-1)+1;
	return 0;
}