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 著名的快速排序算法里有一个经典的划分 ...
随机推荐
- zoj 1037 最短路
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=37 找规律,水题 #include<iostream> #inclu ...
- UVA1584(环状序列)
对于序列的最小值,可以定义一个比较的方法,然后用一般找最小值的方法遍历一遍即可 #include <iostream> #include <string> #include & ...
- 在弹框中获取foreach中遍历的id值,并传递给地址栏(方法2)
1.php有时候我们需要再弹框中获取foreach中遍历的数据(例如id),在弹框中点击按钮并传递给地址栏跳转.那么应该怎么做呢.第二种方法. 2. 可以在弹框中给出一个input hidden 点击 ...
- C#调用SQlite常见问题汇总
最近在做SQLite开发,开发环境是VS2010+ SQLite Ado.Net data Provider.这套Data Provider程序是基于System.Data.SQLite 1.0.66 ...
- webapi 实体作为参数,自动序列化成xml的问题
原文:http://bbs.csdn.net/topics/392038917 关注 Ray_Yang Ray_Yang 本版等级: #6 得分:0回复于: 2016-10-27 21:30:51 ...
- 【PHP系列】PHP 7.0新增特性详解
开始介绍PHP7.0新特性,具体的可以参照官网的介绍,我来挑一些给大家详细讲解下 http://php.net/manual/en/migration70.new-features.php 1. ?? ...
- Scratch-Blockly配置过程
原文地址:https://blog.csdn.net/litianquan/article/details/82735876 Scratch-Blockly配置过程 由于Blockly案例库开发项目需 ...
- 将csv导出json格式
将csv导出json格式 import os,csv,json cf = open('D:\OneDrive\\Tech\\Script\\Powershell_Script\\Uxin_work\\ ...
- 软件磁盘阵列 (Software RAID)
什么是 RAID 磁盘阵列全名是『 Redundant Arrays of Inexpensive Disks, RAID 』,容错式廉价磁盘阵列. RAID 可以通过一些技术(软件或硬件),将多个较 ...
- VC 6.0 MFC关闭对话框在win7出现崩溃的情况
Ctrl + W 掉出来class管理 添加OnDestory方法 void CPackUpItemToSetDlg::OnDestroy() { exit(1); CDialog::OnDestro ...