一、题目描述
Input Specification:
Output Specification:
Sample Input:
5
1 3 2 4 5
Sample Output:
3
1 4 5
二、解题思路
这道题抽象出来其实就是判断一个序列中哪些数满足左边的数都比它小而右边的数都比它大这个条件,我们可以用mxm数组表示每个位置左边最大的数,用minm数组表示每个位置右边最小的数,这两个数组更新完之后,遍历所有数,如果满足v[i] > mxm[i] && v[i] < minm[i],则我们可以把该元素存入答案数组,最后输出即可。
三、AC代码
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = 100010;
const int INF = 1000000001;
LL mxm[maxn] = {0}; //每个位置左边的最大值
LL minm[maxn] = {INF}; //每个位置右边的最小值
int main()
{
int N, cnt = 0;
LL tmp;
scanf("%d", &N);
vector<LL> v, ans;
for(int i=0; i<N; i++)
{
scanf("%lld", &tmp);
v.push_back(tmp);
if(i==0) mxm[i] = 0; //第一个元素左边没有任何数,记左边的最大值为0
else
{
if(v[i-1] > mxm[i-1]) mxm[i] = v[i-1]; //如果前一个元素大于前一个元素左边所有元素的最大值,则当前元素左边最大数即为前一个数
else mxm[i] = mxm[i-1]; //否则当前元素左边最大数即为前一个数左边最大数
}
}
int sze = v.size();
for(int i=sze-1; i>=0; i--)
{
if(i==sze-1) minm[i] = INF; //最后一个数的右边没有数,我们把它右边的最小值设为INF
else
{
if(v[i+1] < minm[i+1]) minm[i] = v[i+1]; //类似地,如果后一个数比后一个数右边的最小的数还小,则当前元素右边最小数即为后一个数
else minm[i] = minm[i+1];
}
}
for(int i=0; i<sze; i++)
{
if(v[i] > mxm[i] && v[i] < minm[i]) //满足条件的数存入ans
ans.push_back(v[i]);
}
sze = ans.size();
printf("%d\n", sze);
for(int i=0; i<sze; i++)
{
if(i==0) printf("%d", ans[i]);
else printf(" %d", ans[i]);
}
printf("\n");
return 0;
}