可以设置两个数组一个存储某个位置上左侧的最大值,一个存储某个位置上右侧的最小值,随后遍历当前数组 如果当前的值>左侧最大值<右侧最小值,则可以作为主元
#include <bits/stdc++.h>
using namespace std;
int main(){
int N;
cin>>N;
int A[N],leftMax[N]={0},rightMin[N]={0};
rightMin[N-1]=INT_MAX;
for (int i = 0; i < N; ++i) {
cin>>A[i];
}
for (int i = 1; i < N; ++i) {
leftMax[i]=max(leftMax[i-1],A[i-1]);
}
for (int i = N-2; i >=0 ; --i) {
rightMin[i]=min(rightMin[i+1],A[i+1]);
}
vector<int> result;
for (int i = 0; i < N; ++i) {
if (A[i]>leftMax[i] and A[i]<rightMin[i])
result.push_back(A[i]);
}
sort(result.begin(),result.end());
printf("%d\n",result.size());
if (result.size()==0)
printf("\n");
else {
for (int i = 0; i < result.size(); ++i) {
printf("%s%d", i == 0 ? "" : " ", result[i]);
}
}
return 0;
}