题目链接:点击打开链接
知识点笔记:
用两个数组leftMax和rightMin,leftMax[i]和rightMin[i]分别表示i左边最大的数和i右边最小的数,这样一来,判断a[i]是不是主元,只需要判断a[i]>leftMax[i] && a[i]<rightMin[i]
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100010;
const long long INF = 1<<31-1;
long long a[MAXN],leftMax[MAXN],rightMin[MAXN];
long long ans[MAXN],num=0; //ans记录所有主元
int main() {
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lld",&a[i]);
}
leftMax[0] = 0;
for(int i=1;i<n;i++){
leftMax[i]=max(leftMax[i-1],a[i-1]);
}
rightMin[n-1]=INF;
for(int i=n-2;i>=0;i--){
rightMin[i]=min(rightMin[i+1],a[i+1]);
}
for(int i=0;i<n;i++){
if(a[i]>leftMax[i]&&a[i]<rightMin[i])
ans[num++]=a[i];
}
printf("%lld\n",num);
for(int i=0;i<num;i++){
printf("%lld",ans[i]);
if(i<num-1) printf(" ");
}
printf("\n");
return 0;
}