题意很简单,大力枚举显然不行
O
(
n
2
)
O(n^2)
O(n2)
可以首先从前往后扫一遍记录最大值,开一个数组记录一下 f_max
从后扫一遍记录最小值 l_min
O(n)
最后一句代码是本题的坑点,如果没有的话就显示格式错误。。。
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include<stack>
#include<queue>
using namespace std;
const int MaxN = 100100;
int a[MaxN]; //data matrix
int f_max[MaxN], l_min[MaxN]; //The max element of front data and ...
int main() {
int N;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> a[i];
}
f_max[0]=a[0];
for (int i = 1; i < N; i++) {
if (a[i] > f_max[i - 1])
f_max[i] = a[i];
else
f_max[i] = f_max[i - 1];
}
l_min[N - 1] = a[N - 1];
for (int i = N - 2; i >= 0; i--) {
if (a[i] < l_min[i + 1])
l_min[i] = a[i];
else
l_min[i] = l_min[i + 1];
}
//Find pivot candidates
vector<int> pi_c;
if (a[0] <= l_min[1])
pi_c.push_back(a[0]);
if (a[N - 1] >= f_max[N - 2])
pi_c.push_back(a[N - 1]);
for (int i = 1; i < N-1; i++) {
if (a[i] >= f_max[i - 1] && a[i] <= l_min[i + 1])
pi_c.push_back(a[i]);
}
//print these candidates in increasing order.
sort(pi_c.begin(), pi_c.end());
cout << pi_c.size() << endl;
//cout << "\n";
for (int i = 0; i < pi_c.size(); i++) {
cout << pi_c[i];
if (i == pi_c.size() - 1)
cout << endl;
else
cout << " ";
}
if (pi_c.size() == 0) {
printf("\n");
}
return 0;
}