题目描述:
假设序列满足先单调递增然后单调递减,同时相邻数字不同,可以是只有单调递增或递减。问题是怎么能使访问元素的次数最少?
思路:
可以使用二分的方法,令mid = (left + right) mod 2, 然后检查a[m]和a[m-1], 如果a[m]>a[m-1], 那么最大值不可能在a[l…m-1], 反正不可能在a[m…r]. 访问次数为2*lg(n). (没有证明是最少次数的,所以可能不是最少)
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <set>
using namespace std;
int a[100011];
int peak_element(int *a, int l, int r){
if(l == r)return l;
if(l + 1 == r){
if(a[l]>a[r]){
return l;
}else{
return r;
}
}
int m = (l + r) >> 1;
if(a[m] > a[m-1]){
return peak_element(a, m, r);
}else{
return peak_element(a, l, m -1);
}
}
int main(){
int n;
while(scanf("%d",&n) > 0){
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
printf("%d\n",a[peak_element(a,0,n-1)]);
}
return 0;
}