题意:给出一个数字序列,问哪几个数字符合快排中pivot元素的性质。
思路:以快排为背景,实属逻辑题。pivot左边的值比它小,右边的值比它大。定义数组left[]和right[],其中left[i]表示区间[0~i-1]中的最大值,right[i]表示区间[i+1,n-1]的最小值,而符合条件的pivot只要满足data[i]>left[i] && data[i]<right[i]即可。在寻找符合条件的pivot之前要先把left[]和right[]预处理好,left[]的更新从左往右,可以在输入数据时同步更新,而right[]需要从右往左进行更新。
代码:
#include <cstdio> #include <set> using namespace std; const int maxn=100005; int data[maxn],left[maxn],right[maxn]; set<int> ans; int main() { int n,maxLeft=-1,minRight=1000000010; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&data[i]); left[i]=maxLeft; if(data[i] > maxLeft) maxLeft=data[i]; } for(int i=n-1;i>=0;i--){ right[i]=minRight; if(data[i] < minRight) minRight=data[i]; } for(int i=0;i<n;i++){ if(data[i]>left[i] && data[i]<right[i]) ans.insert(data[i]); } printf("%d\n",ans.size()); int k=0; for(auto it:ans){ printf("%d",it); k++; if(k<ans.size()) printf(" "); } printf("\n");//格式问题 return 0; }