【1101】Quick Sort (25 分)

举报
野猪佩奇996 发表于 2022/01/23 02:19:05 2022/01/23
【摘要】 1.题目 https://pintia.cn/problem-sets/994805342720868352/problems/994805377432928256 基于快排背景,其实就是找主元。 2.思路 利用继承关系求出每个元素A[i]的左边的最大值和右边的最小值(注意:要使得A[i]的左边的左右元素都比A[i]要小,所以要找...

1.题目

https://pintia.cn/problem-sets/994805342720868352/problems/994805377432928256
基于快排背景,其实就是找主元。

2.思路

利用继承关系求出每个元素A[i]的左边的最大值和右边的最小值(注意:要使得A[i]的左边的左右元素都比A[i]要小,所以要找A[i]左边的最大值进行比较)。
(1)A[0]~A[i-2]的最大值即leftMax[i-1],而A[0]~A[i-1]的最大值即leftMax[i],for循环内的判断如下:


  
  1. if(A[i-1]>leftMax[i-1])
  2. leftMax[i]=A[i-1];
  3. else if(A[i-1]<leftMax[i-1])
  4. leftMax[i]=leftMax[i-1];//直接继承上个元素记录的max

(2)同理也可以用rightMin数组记录序列A的每一位的最小位(不含本位),即rightMin[i]表示A[i+1]~A[n-1]的最小值(初值rightMin=INF,从右到左遍历),和上面方法一样for遍历一次。
(3)最后一次for遍历A序列进行判断,如果leftMax[i]小于A[i],且rightMin[i]大于A[i],则可以判断A[i]是主元,并记录到ans[i]数组中最后输出即可。

3.代码


  
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<algorithm>
  5. using namespace std;
  6. const int MAXN=100010;
  7. const int INF=0x3fffffff; //一个很大的数
  8. //a为序列,leftMax和rightMin分别为每一位左边最大的数和右边最小的数
  9. int a[MAXN], leftMax[MAXN] ,rightMin[MAXN];
  10. //ans记录所有主元,num为主元个数
  11. int ans[MAXN],num=0;
  12. int main(){
  13. int n;
  14. scanf("%d",&n);
  15. for(int i=0;i<n;i++){
  16. scanf("%d",&a[i]); //输入序列元素
  17. }
  18. leftMax[0]=0; //A[0]左边没有比它大的数
  19. for(int i=1;i<n;i++){
  20. leftMax[i]=max( leftMax[i-1] , a[i-1] ); //由i-1推得i
  21. //注意加头文件algorithm后才能直接用max或min
  22. }
  23. rightMin[n-1]=INF; //A[n-1]右边没有比它小的数
  24. for(int i=n-2;i>=0;i--){
  25. rightMin[i]=min( rightMin[i+1] , a[i+1] );//由i-1推得i
  26. }
  27. for(int i=0;i<n;i++){
  28. //左边所有数比它小,右边所有数比它大
  29. if( leftMax[i]<a[i] && rightMin[i]>a[i]){
  30. ans[num++]=a[i]; //记录主元
  31. }
  32. }
  33. printf("%d\n",num); //输出主元个数
  34. for(int i=0; i<num; i++){
  35. printf("%d",ans[i]); //依次输出所有主元
  36. if(i<num-1) printf(" ");
  37. }
  38. printf("\n"); //必须有换行
  39. system("pause");
  40. return 0;
  41. }

4.注意点

(1)暴力判断会超时。
(2)当主元为0个时,第二行虽然没输出主元,但也要输出一个换行。

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/98374894

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。