问题描述:
已知一个线性序列:a1,a2,a3...an,每个元素互不相等。 在这个线性序列中寻找ax,满足 : ai<ax<aj, (i<x,j>x),即ax大于其前面的所有数,但小于其后面的所有数。
一个O(n)时间的解决方法:
第一步:从左向右找最大值max,每遇到一个比max大的值就替换max,并在当前位置标记一次。
第二步:从右向左找最小值min,每遇到一个比min小的值就替换min,并在当前位置标记一次。
第三步:从整个序列中搜索被标记两次的位置,此位置便是要找的中位数。
伪代码:
int a[] ;a1->an
int tag[]=0;
int max=a[n],min=a[1];
for i =1 -> n :
if a[i]>=max;
max=a[i];
tag[i]++;
for i=n -> 1:
if a[i]<=min;
min=a[i];
tag[i]++;
for i=1 -> n:
if tag[i]==2:
print a[i];