PAT——1045. 快速排序(25)
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的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
package com.hone.basical; import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* 模拟快速排序,运行时间超时,按照快速排序的规则模拟,左边的元素都比x小,右边的元素都比x大
* 原题目:https://www.patest.cn/contests/pat-b-practise/1044
* @author Xia
*/
public class basicalLevel1045quickSortMain { public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
int[] a = new int[n];
for (int i = 0; i < a.length; i++) {
a[i] = in.nextInt();
}
List<Integer> mainS = new ArrayList<>();
for (int i = 0; i < a.length; i++) {
int flag = 1; //1代表是主元
//判断左边
for (int j = 0; j < i; j++) {
if (a[j]>a[i]) {
flag = 0;
break;
}
}
//判断右边
for (int j = i+1; j > i&&j<a.length; j++) {
if (a[j]<a[i]) {
flag = 0;
break;
}
}
if (flag == 1)
mainS.add(a[i]);
}
System.out.println(mainS.size());
System.out.print(mainS.get(0));
for (int i = 1; i < mainS.size(); i++) {
System.out.print(" " + mainS.get(i));
}
}
}
方法二:
package com.hone.basical; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
/**
* 刚才第一个全部模拟快速排序的方法,时间复杂度太高。(下面定义一个时间复杂度低一些的)
* 原题目:https://www.patest.cn/contests/pat-b-practise/1044
* @author Xia
* 主元的位置与排完序后该元素所在位置相同,那么再满足它是它之前所有元素中最大的一个,就可以断定它可能是主元。
* 此时的时间复杂度为 n 但是不知道为什么这道题也运行超时!!!!!
*/
public class basicalLevel1045quickSortMain2 { public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
int[] a = new int[n];
int[] b = new int[n]; //已经排序的元素
int max = 0; //用于标记使用
for (int i = 0; i < a.length; i++) {
a[i] = in.nextInt();
b[i] = a[i];
}
Arrays.sort(b);
List<Integer> mainS = new ArrayList<>();
for (int i = 0; i < n; i++) {
if (a[i]>max)
max = a[i];
//如果当前数是从第一个数到当前数最大的一个,且与排完顺序对应位置的数相同则该数就有可能是主元
if (max == b[i]&&a[i] == b[i])
mainS.add(b[i]);
}
System.out.println(mainS.size());
System.out.print(mainS.get(0));
for (int i = 1; i < mainS.size(); i++) {
System.out.print(" " + mainS.get(i));
}
}
}
PAT——1045. 快速排序(25)的更多相关文章
- PAT 1045 快速排序(25)(STL-set+思路+测试点分析)
1045 快速排序(25)(25 分) 著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分 ...
- PAT 1045. 快速排序(25)
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的N个互不相同的正整数的排列,请问有多 ...
- PAT-乙级-1045. 快速排序(25)
1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...
- PAT B1045 快速排序(25)
1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...
- PAT Basic 1045 快速排序 (25 分)
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的 N 个互不相同的正整数的排列,请问 ...
- PAT——1045. 快速排序
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的N个互不相同的正整数的排列,请问有多 ...
- PAT 1045 快速排序
https://pintia.cn/problem-sets/994805260223102976/problems/994805278589960192 著名的快速排序算法里有一个经典的划分过程:我 ...
- 1045 快速排序 (25 分)C语言
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的 N 个互不相同的正整数的排列,请问 ...
- PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)
1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...
随机推荐
- C#获取AD域中计算机和用户的信息
如果你的计算机加入了某个AD域,则可以获取该域中所有的计算机和用户的信息. 所用程序集,需要.Net Framework 4. 添加程序集引用 System.DirectoryServices.Acc ...
- K:单例模式中存在的问题
对于单例模式的实现,无论其是否具有懒加载的功能,我们的目标是有且仅生成一个对象.但是,实际上,对于单例模式的一般实现,都会存在着以下的两个问题: 序列化攻击: 对于枚举方式实现的单例模式,并不存在 ...
- Java:反射与代理
Java世界的繁荣反射这一特性有很大功劳,可以获取全面的类型信息. /** * */ package ref; import java.lang.reflect.Field; import java. ...
- PAT 1052. Linked List Sorting
这场考试当年还参加了,当时直接用内置的排序了,否则自己写归并排序浪费时间啊,现在来练习一发.估计又有些节点没在链表里面,当时没考虑这个情况,所以一直有些case没过 #include <iost ...
- System.out.println与System.err.println的区别
public class Test2 { static { System.out.println("1"); } { System.out.println("2" ...
- bootstrap框架怎么在html页面加载使用
今天敲代码的时候,正好碰到这个问题. 与大家分享这个解决方法: 1/7 到bootstrap官方网站下载,对于我们开发者来说,直接下载编译和压缩后的CSS.JavaScript文件,另外还包含 ...
- laravel之路由汇总
- Web开发须知的浏览器内幕 缓存与存储篇(2)
本文禁止转载,由UC浏览器内部出品. 3. HTTP Cache 综述 HTTP Cache是完全按照IETF规范实现的,最新的RFC规范地址是 https://tools.ietf.org/html ...
- 《Linux命令行与Shell脚本编程大全第2版》读书笔记
公司说不准用云笔记了,吓得我赶紧把笔记贴到博客上先..... 近3年前的了,只有一半的章节,后面的没空记录了.... 第1章 可以cat /proc/meminfo文件来观察Linux系统上虚拟内存的 ...
- Totem协议(SRP/RRP)讲解
基本概念 •SRP: The Totem Single-Ring Ordering and MembershipProtocol –基于以太网的组通信协议,节点间组成单环结构 ...