著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的 N 个互不相同的正整数的排列,请问有多少个元素可能是划分前选取的主元?

例如给定 N=5, 排列是1、3、2、4、5。则:

  • 1 的左边没有元素,右边的元素都比它大,所以它可能是主元;
  • 尽管 3 的左边元素都比它小,但其右边的 2 比它小,所以它不能是主元;
  • 尽管 2 的右边元素都比它大,但其左边的 3 比它大,所以它不能是主元;
  • 类似原因,4 和 5 都可能是主元。

因此,有 3 个元素可能是主元。

输入格式:

输入在第 1 行中给出一个正整数 N(≤105); 第 2 行是空格分隔的 N 个不同的正整数,每个数不超过 109。

输出格式:

在第 1 行中输出有可能是主元的元素个数;在第 2 行中按递增顺序输出这些元素,其间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

5
1 3 2 4 5

输出样例:

3
1 4 5

代码长度限制

16 KB

Java (javac)

时间限制

800 ms

内存限制

64 MB

其他编译器

时间限制

200 ms

内存限制

64 MB

解题思路:这道题并不难实现,但是直接for嵌套循环时间复杂度超过题目限制,后几个测试点过不了。后来换种思考方式,遍历一遍给的数组,看哪些数字出现在它本来的位置上(即升序排序后的位置)如果相同则是主元,这种办法还是有缺陷,并不能囊括所有的情况,不过多对了一个测试点。 后面参考了别人的做法,在上述办法的基础上继续改造,判断哪些数组出现在它本来的位置上并且它是否大于它左边的数中的最大值,那它一定就是主元,这样就能通过所有的测试点,最后一个坑,输出完所有的结果之后需要输出一个换行……

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{int n;int num[100000];int number[100000];cin>>n;for(int i=0;i<n;i++){cin>>num[i];number[i] = num[i];}sort(num,num+n);   //对num进行升序排序int max = 0;int count[100000];  //count数组记录主元int k = 0;for(int i=0;i<n;i++){if(num[i]==number[i]&&number[i]>max)  //如果数出现在它本来的位置并且大于前面的最大值,则它是主元count[k++] = number[i];if(number[i]>max) max = number[i];}sort(count,count+k);  //主元数组升序排序cout<<k<<endl;for(int i =0;i<k;i++){if(i!=k-1)cout<<count[i]<<" ";elsecout<<count[i];}cout<<endl;  //最后要输出一个换行
}

PAT——1045 快速排序相关推荐

  1. PAT 1045 快速排序(25)(STL-set+思路+测试点分析)

    1045 快速排序(25)(25 分) 著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分 ...

  2. Pat乙级 1045 快速排序

    Pat乙级 1045 快速排序 思路 代码 题目网址 https://pintia.cn/problem-sets/994805260223102976/problems/99480527858996 ...

  3. PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)

    1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...

  4. 1045 快速排序 (25 分)

    1045 快速排序 (25 分) 著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的 ...

  5. C++学习之路 | PTA乙级—— 1045 快速排序 (25 分)(精简)

    1045 快速排序 (25 分) 著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的 ...

  6. PAT (Basic Level) 1045 快速排序(思维)

    题目链接:点击查看 题目大意:根据快速排序的定义,找出主元,主元就是在未排序之前,当前位置之前的数都比其自身小,当前位置之后的数都比其自身大 题目分析:这个题可以暴力混分..但没必要,n*n的时间复杂 ...

  7. 1045. 快速排序(25)-PAT乙级真题

    原题: 著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的N个互不相同的正整数的排列, ...

  8. 【PAT乙级】1045 快速排序 (25 分)

    题目地址 #include<cstdio> #include<iostream> #include<algorithm> #include<vector> ...

  9. 测试点2详解:1045 快速排序 (25分)——23行代码满分

    立志用更少的代码做更高效的表达 Pat乙级最优化代码+题解+分析汇总-->传送门 著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到 ...

最新文章

  1. arduino点阵声音频谱_基于Arduino和频谱分析的LED音乐课节拍器
  2. 少走弯路:强烈推荐的TensorFlow快速入门资料(可下载)
  3. 深入浅出 Java 微服务视频
  4. docker容器的构建
  5. 如何打造具有绝对市场竞争力的团队
  6. [html] html元素哪些标签是不可替换元素?哪些是可替换元素?
  7. python怎么发图文_用Python发一封图文并茂的邮件
  8. java 模拟平台_用Java程序模拟登陆网站平台
  9. 2120: 数颜色(带修莫队)
  10. HTTP MIME 类型
  11. RPC(RemoteProcedureCallProtocol)
  12. 检测代码运行时间(微秒级)
  13. hualinux0.9 网络篇:CCNA学习及思科模拟器选择
  14. idm6.40最新版exe下载器介绍
  15. 哈尔滨理工大学计算机学院竞赛,计算机学院成功举办学院Arduino创意设计竞赛...
  16. Leetcode799-香槟塔
  17. 从零开始学习SFR-- 1.0
  18. android原生农场壁纸,Android 6.0高清壁纸下载-Android 6.0原生壁纸高清免费打包下载-东坡下载...
  19. 2014上海全国邀请赛题解 HDOJ 5090-5099
  20. 学习游戏软件开发需要哪些基础知识

热门文章

  1. 罗列当前文件夹下所有文件
  2. 【Ogre编程入门与进阶】第十七章 Ogre3D 和CEGUI 的结合
  3. HTML代码转word!亲测!可用!!!
  4. CSS进阶(一)背景与边框
  5. c语言文件分割与合并程序详解,如何实现将一个文件分割成多个小文件
  6. trw2000帮助文档
  7. 表格插件vxe-table
  8. 24点算法 | 逆波兰表达式实现去重复
  9. 强烈推荐使用五笔加加输入法
  10. python机器学习:搭建tensorflow环境,下载Keras库并在python中成功完成导入。pycharm的相关配置。