PAT乙级1045 快速排序

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

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

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

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

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

输入样例:
5
1 3 2 4 5
输出样例:
3
1 4 5

解题思路:这题我认为时间给的比较仓促,还是要找最优解算法,题目很清晰就是快排的一次划分,那我们就按照定义来看,主元必须是左边小于它右边大于它的,那我们一次循环找到左边最大的和它比,再另一次循环找到右边最小的和它比,满足左边最大的小于等于它,同时右边最小的也大于等于它,它不就是主元嘛。。这样我们俩次循环就可以搞定,不停维护最大值和最小值即可,如果别的办法恐怕 就得o(n^2)恐怕会超时。

c语言代码如下

#include<stdio.h>
#include<string.h>
int main()
{int n,i;scanf("%d",&n);int a[n];int b[n];int c[n];memset(b,0,sizeof(b));memset(c,0,sizeof(c));for(i=0;i<n;i++)scanf("%d",a+i);int max=a[0],min=a[n-1];for(i=0;i<n;i++){if(a[i]>=max){b[i]=1;max=a[i];}}for(i=n-1;i>=0;i--){if(a[i]<=min){c[i]=1;min=a[i];}}int output[n],count=0;for(i=0;i<n;i++){if(b[i]==1&&c[i]==1){output[count++]=a[i];}}printf("%d\n",count);for(i=0;i<count;i++){if(i!=count-1)printf("%d ",output[i]);elseprintf("%d",output[i]);}printf("\n");return 0;
}

在这里插入图片描述
python版本:尽量不要是使用函数,哪怕麻烦一点,太容易超时了

n=int(input())
s=input().split()
for i in range(n):s[i]=int(s[i])
b=[0]*n
c=[0]*n
max_p=s[0]
min_l=s[n-1]
for i in range(n):if s[i]>=max_p:b[i]=1max_p=s[i]
i=n-1
while(i>=0):if s[i]<=min_l:c[i]=1min_l=s[i]i=i-1
output=[]
count=0
for i in range(n):if b[i]==1 and c[i]==1:output.append((s[i]))count+=1
print(count)
for i in range(count):if i == count-1:print(output[i],end='')else:print(output[i],end=' ')
print()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/314345.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot + Vue 抖音全平台项目

简介 本项目是一个短视频平台&#xff0c;拥有热度排行榜&#xff0c;热门视频&#xff0c;兴趣推送&#xff0c;关注推送&#xff0c;内容审核等功能。 源码下载 网盘 (访问密码: 8418) 登录/注册 首页 创作中心 架构设计 上传视频业务流程 视频推送流程 1.用户订阅分类后…

C#中string.ToUpper()和string.ToLower()的用法

目录 一、关于ToUpper()和ToLower() 1.ToUpper() 2.ToLower() 3.小结 二、实例 三、生成效果 一、关于ToUpper()和ToLower() 1.ToUpper() 使用字符串对象的ToUpper方法可以将字符串中的字母全部转换为大写。 string P_str_book "mingribook".ToUpper()…

redis 从0到1完整学习 (十四):RedisObject 之 ZSet 类型

文章目录 1. 引言2. redis 源码下载3. redisObject 管理 ZSet 类型的数据结构4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;re…

Python开发环境[PycharmEclipseAnaconda]

Pycharm配置Python开发环境 每种语言的开发工具都有很多&#xff0c;如果写一些小的脚本或者小的工具&#xff0c;建议直接使用命令行或者Python自带的IDLE&#xff0c;如果进行大型的开发工作建议使用Pycharm&#xff0c;当然这属于个人喜好。 虽然Pycharm给了我们一个美观的…

K8s实战入门

1.NameSpace Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下&#xff0c;kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中&#xff0c;可能不想让两个Pod之间进行互相…

Iterator(迭代器) 和 list

Iterator&#xff08;迭代器&#xff09; 和 list 文章目录 一、Iterator&#xff08;迭代器&#xff09;二、list 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Iterator&#xff08;迭代器&#xff09; 对 collection 进行迭代的迭代器。迭代器…

【Unity入门】UGUI之Slider(滑动条)

目录 一、什么是Slider&#xff1f;二、Slider属性与功能 一、什么是Slider&#xff1f; Slider控件允许用户可以通过鼠标来在预先确定的范围调节数值 我们可以在Hierarchy视图右键 -> UI ->Slider来创建滑动条 通过上图可以发现Unity内置的Slider主要有3部分&#x…

互斥锁-第二十七天

互斥锁 定义&#xff1a;解决临界区最简单的工具&#xff08;一个进程在进入临界区时应获得锁&#xff1b;在退出临界区时释放锁。函数acquire()获得锁&#xff0c;release()释放锁&#xff09; 注意事项&#xff1a;acquire()或release()的执行必须是原子操作&#xff0c;因…

createElement, parentNode, removeChild, appendChild

1获取父节点 var childNode document.getElementById("child"); var parentNode childNode.parentNode; // 获取父节点利用dom获取元素要嵌套 引出&#xff1a;利用父子兄节点关系获取元素 标签&#xff0c;元素&#xff0c;元素节点空格&#xff0c;文本节点属性…

buildadmin实现多级关联下拉效果

文章目录 最终效果开始重新渲染组件编辑渲染完结 最终效果 开始 popupForm.vue代码 <FormItem :label"t(interior.interiorApply.interior_index_id)" type"remoteSelect"v-model"baTable.form.items!.interior_index_id" prop"interi…

Vue:使用IDEA开发Vue的相关配置

一、IDEA无法识别.vue文件 1、IDEA 添加Vue插件 2、添加Vue配置 File | Settings | Editor | File Types 找到 HTML 文件 在下面点号 输入*.vue 二、IDEA无法创建.vue文件 1、问题 在开发过程中&#xff0c;发现创建文件的界面&#xff0c;没有vue模板 2、相关配置 Fi…

MySql——1146 - Table‘mysql.proc‘doesn‘t exit是这个

项目场景&#xff1a; 做自己的小项目需要连接mysql数据库 问题描述 点击数据库时报错 1146 - Table’mysql.proc’doesn’t exit 原因分析&#xff1a; 误删原生的mysql数据库 解决方案&#xff1a; 重新安装装部署mysql就好了 注意不要轻易删除原生的东西