题目
题目来源:https://pintia.cn/problem-sets/994805342720868352/problems/994805366343188480
思路
其实很简单,如果我是主元,则前面最大的数要小于我,后面最小的要大于我,
代码
#include <iostream>
#include <vector>
using namespace std;
int a[100005] = {0};
int maxArr[100005] = {0};
int minArr[100005] = {0};
int main(){
vector<int> res;
int n;//数字个数
cin >> n;
for(int i=0; i<n; i++) cin >> a[i];
// 找所有的数前面最大的
maxArr[0] = 0;
for(int i=1; i<n; i++){
if(a[i-1] > maxArr[i-1]){
maxArr[i] = a[i-1];
}
else{
maxArr[i] = maxArr[i-1];
}
}
//找所有数字后面最小的
minArr[n-1] = 1000000005;
for(int i=n-2; i>=0; i--){
if(a[i+1] < minArr[i+1]){
minArr[i] = a[i+1];
}
else{
minArr[i] = minArr[i+1];
}
}
//前面最大的小于a[i],后面最小的大于a[i]
// a[n-1]单独做判断
for(int i=0; i<n-1; i++){
if(a[i] > maxArr[i] && a[i] < minArr[i]) res.push_back(a[i]);
}
// 判断a[n-1]
if(maxArr[n-1] < a[n-1]) res.push_back(a[n-1]);
int cnt = res.size();
cout << cnt << endl;
if(cnt == 0) cout << endl;
else{
for(int i=0; i<cnt-1; i++) cout << res[i] << " ";
cout << res[cnt-1];
}
// 不过的测试点,段错误,0个主元,输出空行,这个错误点看了柳神的代码
return 0;
}