(PTA乙级)1045 快速排序 (单调栈思想)

著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的 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
采用单调栈

本题的关键就是判断元素X的左边是否存在比X更大的元素,X的右边是否存在比X更小的元素。如果使用嵌套for循环的话可以暴力解决,时间复杂度为O(n2);当然,也可以使用数组max和数组min,分别存储元素X左边的最大值和X右边的最小值,采用动态规划思想解决。

这里我使用的是单调栈,其实也就是动态规划的思想,使用一个单调递增栈和一个单调递减栈。

注意,如果没有元素满足情况,在输出0之后还要再输出一个空行

#include<iostream>
#include<algorithm>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<cstdlib>
using namespace std;int main(){int n;cin>>n;long long *num=new long long[n+2];int *small=new int [n+2];int *big=new int[n+2];for(int i=0;i<n;i++){cin>>num[i];small[i]=-1;big[i]=-1;}stack<int> s1;// 向右单调递增栈 for(int i=0;i<n;i++){while(!s1.empty()&&num[i]<num[s1.top()]){small[s1.top()]=i;s1.pop();}s1.push(i);}stack<int> s2;
//	向左单调递减栈 for(int i=n-1;i>=0;i--){while(!s2.empty()&&num[i]>num[s2.top()]){big[s2.top()]=i;s2.pop();}s2.push(i);}vector<long long> v1;for(int i=0;i<n;i++){if(small[i]<0&&big[i]<0) v1.push_back(num[i]);}cout<<v1.size()<<endl;if(v1.size()>0){sort(v1.begin(),v1.end(),[&](long long a,long long b){return a<b;});cout<<v1[0];for(int i=1;i<v1.size();i++)cout<<" "<<v1[i];}// 如果没有元素了,直接输出一个空行 cout<<endl;return 0;
}

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

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

相关文章

Java 调用 Groovy 脚本的简单案例

Java 调用 Groovy 脚本的简单案例 前言 Groovy 和 Java 都是使用 JVM 虚拟机进行解释执行的。工作中会遇到一些场景&#xff0c;需要对特殊的业务进行解耦。那段业务可能会经常变动&#xff0c;如果直接在Java代码里写业务的话就会涉及频繁的发包服务重启这类情况&#xff0c;…

金融防线升级:构筑数据安全的不可逾越之墙

近日&#xff0c;中国人民银行专栏《金融科技支持高质量发展》指出&#xff0c;应不断增强金融行业的网络安全和数据安全保障能力&#xff0c;坚持总体国家安全观&#xff0c;持续完善金融网络安全、数据安全制度体系&#xff0c;依法开展金融业关键信息基础设施安全保护工作&a…

mac删除带锁标识的app

一 、我们这里要删除FortiClient.app 带锁 常规方式删除不掉带锁的 app【如下图】 二、删除命令&#xff0c;依次执行即可。 /bin/ls -dleO /Applications/FortiClient.app sudo /usr/bin/chflags -R noschg /Applications/FortiClient.app /bin/ls -dleO /Applications/Forti…

Wireshark4.2.3 x64 Setup20240313

参考&#xff1a;【抓包工具】win 10 / win 11&#xff1a;WireShark 下载、安装、使用&#xff08;https://blog.csdn.net/qq_39720249/article/details/128157223&#xff09; 文章目录 下载安装12 license 许可证3 donations&#xff1a;捐款4 Choose Components&#xff1…

算法-图的存储,图的转置,拓扑排序

1.图的存储 图用来对关系建模&#xff0e;图是节点和边构成的集合&#xff0e;节点反映图的元素集合&#xff0c;边反映图的元素集合中元素间的关系&#xff0e; 上述是由五个节点&#xff0c;三条边构成的结构&#xff0e;我们可以用图对其建模&#xff0e; 对由节点&#x…

大数据开发(Kafka面试真题-卷三)

大数据开发&#xff08;Kafka面试真题&#xff09; 1、Kafka是如何进行数据备份的&#xff1f;2、Kafka里面存的数据格式是什么样的&#xff1f;3、Kafka是如何清理过期文件的&#xff1f;4、Kafka的一条message中包含了哪些信息&#xff1f;5、Kafka中的数据能彻底删除吗&…

【Python】Leetcode 240. 搜索二维矩阵 II - 削减矩阵+递归,击败88%

描述 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。 该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 思路 确定左右及上下限&#xff0c;削减矩阵&#xff0c;递归。 注意判断四个端…

Python 面向对象

在 Python 中&#xff0c;面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种程序设计范例&#xff0c;它以对象为基础&#xff0c;将数据和操作封装在对象内部&#xff0c;通过定义类和创建对象来实现。让我们来介绍 Python 中面向对象编…

【Git】统计所有仓库单个用户的代码提交量

将以下代码保存为 gitStatics.sh,并且放置在存放所有仓库的文件夹内,与仓库文件保持同级。 #!/bin/bash # 检查是否提供了足够的参数 if [ "$#" -ne 1 ]; then echo "Usage: $0 <username>" exit 1 fi # 获取用户名参数 user

API数据能力开放架构 数据api接口

一.API数据接口可以从几个不同的角度来看待&#xff1a; 1. 技术角度&#xff1a;API数据接口是一种技术实现&#xff0c;通常是以HTTP协议或其他网络协议为基础&#xff0c;并采用特定的数据格式&#xff08;如JSON或XML&#xff09;来传递数据。 2. 业务角度&#xff1a;API…

视口坐标转换成Canvas下本地坐标与shader显示在3D物体前

shader显示在3D物体前&#xff0c;先转化成视口坐标 public virtual void SetESignPos() { float x 0; float y 0; int v PlayerPrefsTool.GetSpecialScreen(-1); if (EScreenCamera ! null) { Vector3 viewPointEScreenCa…

前端input上传文件 使用new FormData()同时上传文件类型和JSON数据

失败案例 async uploadFileHandler(e) {if (e.target.files.length) {const files e.target.files[0];let formData new FormData();formData.append("file", files);formData.append("module", "knowledge");fileupload(formData).then(res …

JVM探究

JVM探究 请你谈谈你对JVM的理解&#xff1f;java -> class -> jvm java 8虚拟机和之前的变化更新OOM 内存溢出。栈溢出 StackOverFlowError > 怎么分析JVM的常用调优参数 &#xff1f; 扩大内存内存快照如何抓取&#xff0c;怎么分析Dump文件&#xff1f;知道吗&…

SAP 生产订单中计划成本问题简介

最近财务在月结的时候,发现有生产订单结算的时候有物料不存在计划成本,并且财务顾问反馈这个问题已经存在有一段时间了。通过对生产订单的成本分析按钮查看生产订单的成本 发现确实存在有物料不存在计划成本,但是生产订单存在实际成本。 1、首先想到的是无计划成本的原材料…

使用Python进行图片格式转化/分辨率转化

一.下载python PIY插件库 PIP下载命令: pip install pillow -i https://mirrors.aliyun.com/pypi/simple PIY插件库:pillow Installation - Pillow (PIL Fork) 10.3.0.dev0 documentation 二.分辨率转化 from PIL import Image import osresolution (1024, 1024) with Image…

redis监控

一、Redis监控方法 1、redis info命令 Redis的监控指标主要通过INFO命令获取&#xff0c;该命令可以返回丰富的运行监控信息。info主要有以下几项&#xff0c;因版本不同可能略有差别&#xff1a; # Server redis_version:7.2.4 redis_git_sha1:00000000 redis_git_dirty:0 …

C语言易错知识点:scanf函数

scanf在C语言学习中比较常用&#xff0c;但因为其涉及屏幕缓冲区导致有的时候会调入陷阱&#xff0c;下面分享一下常见的需要注意的事项&#xff1a; 1.输入末尾带有回车\n 当我们输入数据后&#xff0c;最后按下回车时&#xff0c;屏幕缓冲区的末尾都会含有这个字符 scanf的…

Web安全攻防措施

2024最新Web安全攻防教程资料PPT大合集&#xff08;143份&#xff09;.zip 输入验证和过滤&#xff1a;对用户输入进行严格的验证和过滤&#xff0c;以防止SQL注入、跨站脚本攻击&#xff08;XSS&#xff09;等。例如&#xff0c;对特殊字符进行转义处理&#xff0c;限制输入…

代码书写在if __name__ == ‘__main__‘前后的区别

if __name__ __main__这个东西&#xff0c;所有见过python代码的程序猿们一定都不会陌生。为方便理解&#xff0c;有人直接把它等同于java中的主函数。我们今天不是为了来探讨它和Java主函数的异同的&#xff08;因为我已经忘了Java主函数的细节了&#xff0c;也懒得再回顾…&…

leetcode110.平衡二叉树

之前没有通过的样例 return语句只写了一个 return abs(l-r)<1缺少了 isBalanced(root->left)&&isBalanced(root->right);补上就好了 class Solution { public:bool isBalanced(TreeNode* root) {if(!root){return true;}int lgetHeight(root->left);i…