【演算法】單峰序列
阿新 • • 發佈:2018-11-26
單峰序列
問題描述
給定含有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
樣例輸入
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; }