1101 Quick Sort

题意:给出一个数字序列,问哪几个数字符合快排中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;
}

猜你喜欢

转载自www.cnblogs.com/kkmjy/p/9594386.html