hoj 3275 快排划分主元

学快速排序划分的时候,我们学过了选定一个主元val,并将小于val的元素放到它左边,大于val的元素放它右边。

给定划分之后的n(1 <= n <= 100000)个互不相同的正整数的排列,请问哪些元素可能是划分前的主元。

比如给定的5个数是1 3 2 4 5,那么1左边没有元素,右边的元素都比它大,所以可以作为主元;对于第二个元素3来说,左边的元素比3小,右边的2比3小,所以3不可能作为划分之前的主元;同理可以得到4和5也可以作为划分之前的主元。所以输出1 4 5.

Input

多组数据。每组数据的第一行是一个整数n,第二行是n个整数。

Output

对于每一组数据,首先输出可能是主元的元素的个数,然后按照在数组中出现的先后顺序输出可能是主元的元素。数字与数字之间以空格分隔,最后一个数字之后没有空格。

Sample Input

5

1 3 2 4 5


Sample Output

3 1 4 5




首先明确划分主元的条件:左边值全部比它小,右边值全部比它大。 简而言之,作为主元的数大于左边的最大值,小于右边的最小值。

 因此用max[i] 和 min[i] 表示第i位置左侧最大与右侧最小的值。

再用a[i]遍历比较,满足条件的数存在数组b中。

感谢钟蔚弘同学的帮助!

#include <stdio.h>
#include <stdlib.h>
#define maxn 100002
int a[maxn];
int min[maxn],max[maxn];
int b[maxn];
int main()
{
    int n,i,j;
    int n_max,n_min;
    while(scanf("%d",&n) != EOF){
        int count = 0;
        j = 0;
        for(i = 0;i < n; i++) scanf("%d",&a[i]);
        n_max = a[0],n_min = a[n-1];
        max[0] = a[0],min[n-1] = a[n-1];
        max[-1] = max[0],min[n] = min[n-1];
        while(count < n - 1)
        {
            if(a[++count] >= n_max) n_max = a[count];
            max[count] = n_max;
        }
        while(count > 0){
            if(a[--count] <= n_min) n_min = a[count];
            min[count] = n_min;
        }
        for(i = 0;i < n; i++)
        {
            if((a[i] >= max[i-1]) && (a[i] <= min[i+1]))
                b[j++] = a[i];
        }
        printf("%d ",j);
        for(i = 0;i < j; i++)
        {
            printf("%d",b[i]);
            if(i != j - 1) printf(" ");
        }
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值