题目描述
知识点: 快速排序
思路: 判断左边的数是否都小于它,直接与左边的最大值比即可。同时记录左边的最大值,从左往右扫描记录符合元素的个数,然后及时更新最大值。
右边判断数是否都大于他同理。
最后输出符合左右两边条件的数字。
#include<iostream>
#include<map>
#include<vector>
using namespace std;
const int N = 1e5+10;
int left_max = -1;
int right_min = 1e9;
map<int,int> candidate;
int a[N];
int main(){
int n;
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d",&a[i]);
if(a[i] > left_max){
left_max = a[i];
candidate[a[i]] = 1;
}
}
for(int i = n-1;i >= 0;i--){
if(right_min > a[i]){
right_min = a[i];
}else if(candidate[a[i]] == 1) candidate[a[i]] = 0;
}
int cnt = 0;
vector<int> res;
for(auto i : candidate){
if(i.second == 1) {
res.push_back(i.first);
cnt++;
}
}
if(cnt != 0) cout<<cnt<<endl<<res[0];
else cout<<cnt<<endl<<endl;
for(int i = 1;i < cnt;i++) cout<<" "<<res[i];
return 0;
}