这道题想找到一组数据中满足,左边的数字都小于它,右边的数字都大于它的数字。
最暴力的方法n^2会超时
这道题的Quick Sort实际上已经提示我们了,这道题的重点在于发现符合题目条件的数字在sort之后的位置是相同的,这一点回想quick sort过程就很容易验证,并且保证数组中的数字要大于前面数字的最大值,就会满足题意,复杂度体现在排序上,为O(nlogn).
具体代码如下:
#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
vector<int> res;
int a[100005];
int b[100005];
int MAX=0;
int main()
{
int k;
scanf("%d",&k);
vector<int> res;
for(int i=0;i<k;++i)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(a,a+k);
for(int i=0;i<k;++i)
{
if(a[i]==b[i] && b[i]>MAX)
{
res.push_back(a[i]);
}
if(b[i]>MAX)
{
MAX=b[i];
}
}
printf("%lu\n",res.size());
for(int i=0;i<res.size();++i)
{
if(i==0)
printf("%d",res[i]);
else
printf(" %d",res[i]);
}
printf("\n");
return 0;
}