pat甲级1101. Quick Sort (25)、乙级1045. 快速排序(25)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/79523867

欢迎访问我的pat甲级题解目录哦https://blog.csdn.net/richenyunqi/article/details/84981078

欢迎访问我的pat乙级题解目录哦https://blog.csdn.net/richenyunqi/article/details/84981369

题目描述

甲级题目描述

 

乙级题目描述

算法设计

题目要求统计出在一个序列A中左侧数都大,比右侧数都小所有的数。可以定义两个辅助数组leftMax和rightMin,表示存储相应位置处左侧位置的最小值,右侧位置的最大值。同时遍历这三个数组,如果序列A在位置 i 处的元素A[i]>leftMax[i]&&A[i]<rightMin[i],那么A[i]即为主元。遍历完成后所有主元就都可以找到了

注意点

(1)只使用暴力搜索会超时

(2)如果没有主元,在输出0之后还要输出一个空行,否则会有一个测试点不能通过

(3)虽然题目要求按递增顺序输出,但并不需要再按递增顺序进行一次排序。因为按照主元性质,左侧主元一定比右侧主元小,所以只要按照序列中的顺序输出主元,主元本身就是按照递增顺序排序好的。

C++代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int N;
    scanf("%d",&N);
    int a[N],leftMax[N]={0},rightMin[N]={0};//定义存储序列的数组,存储相应位置左侧最大值的数组,存储相应位置右侧最小值的数组
    rightMin[N-1]=INT_MAX;
    for(int i=0;i<N;++i)
        scanf("%d",&a[i]);
    for(int i=1;i<N;++i)//遍历查找相应位置左侧最大值
        leftMax[i]=max(leftMax[i-1],a[i-1]);
    for(int i=N-2;i>=0;--i)//遍历查找相应位置右侧最小值
        rightMin[i]=min(rightMin[i+1],a[i+1]);
    vector<int>result;//存储主元的vector
    for(int i=0;i<N;++i)//查找主元
        if(a[i]>leftMax[i]&&a[i]<rightMin[i])
            result.push_back(a[i]);
    printf("%d\n",result.size());
    //下面的排序语句可有可无
    //    sort(a,a+N,[](const int n1,const int n2){
    //        return n1>n2;
    //    });
    if(result.size()==0)//如果没有这样的主元,输出一个空行
        printf("\n");
    else
        for(int i=0;i<result.size();++i){
            if(i>0)
                printf(" ");
            printf("%d",result[i]);
        }
    return 0;
}

 

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭