1101. Quick Sort (25)

原创 2015年11月20日 21:33:18

1.这道题目需要考虑采用适当的数据结构,即小根堆和大根堆

2.判断某个元素是否能够成为pivot,那么该元素左边数组应该构成一个大根堆,堆顶元素应该小于该元素,该元素的右边构成小根堆,堆顶元素大于该元素

3.左边的小根堆,一直插入即可,利用priority_queue,而右边则需要进行维护,需要编写仿函数

4右边的大根堆维护机制:建立哈希表times,记录每个元素出现的次数,每往后检测新元素数,把新元素出现的次数-1,同时检测大根堆的堆顶元素,如果出现次数为0则弹出,直至剩下出现次数不为0的堆顶


AC代码如下:

//#include<string>
//#include <iomanip>
#include<vector>
#include <algorithm>
//#include<stack>
#include<set>
#include<queue>
#include<map>
//#include<unordered_set>
#include<unordered_map>
//#include <sstream>
//#include "func.h"
//#include <list>
#include<stdio.h>
#include<iostream>
#include<string>
#include<memory.h>
#include<limits.h>
using namespace std;
struct cmp
{
	bool operator()(const int&a, const int&b)
	{
		return a > b;
	}
};
int main(void)
{
	
	int sum;
	cin >> sum;
	int *num = new int[sum];
	map<int, int> times;
	/*vector<int> times(100001, 0);*/
	priority_queue<int> lq;
	priority_queue<int,vector<int>,cmp> rq;
	for (int i = 0; i < sum; i++)
	{
		scanf("%d", &num[i]);
		times[num[i]]++;
		rq.push(num[i]);
	}
	vector<int> ans(0);
	for (int i = 0; i < sum; i++)
	{
		if (i>0) lq.push(num[i - 1]);
		if (rq.size() != 0)
		{//如果右边heap不为空
			times[num[i]]--;//减少num[i]的次数,以维护右边的小根堆
			while (rq.size() != 0 && times[rq.top()] == 0) rq.pop();//检测堆顶元素,出现次数是否为0,如果为0,证明应该被弹出,
			if (rq.size() != 0 && num[i]>rq.top())
			{
				continue;
			}
		}
		if (lq.size() != 0 && num[i] < lq.top())
		{
			continue;
		}
		ans.push_back(num[i]);
	}
	cout << ans.size() << endl;
	sort(ans.begin(), ans.end());
	for (int i = 0; i < ans.size(); i++)
	{
		printf("%d", ans[i]);
		if (i != ans.size() - 1)
			cout << " ";
	}
	cout << endl;//注意在后面添加换行
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

PAT (Advanced Level) 1101. Quick Sort (25) 解题报告

There is a classical process named partition in the famous quick sort algorithm. In this process we ...

A1101. Quick Sort (25)

1101. Quick Sort (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者...

PAT (Advanced Level) Practise 1101 Quick Sort (25)

1101. Quick Sort (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B ...

PAT_A 1101. Quick Sort (25)

PAT-A-1101. Quick Sort (25)注意输出为0,第二行为空,需要输出一个回车
  • scylhy
  • scylhy
  • 2016年10月20日 23:18
  • 221

PAT 1101. Quick Sort (25)

1101. Quick Sort (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B ...

pat-a1101. Quick Sort (25)

开始直接想到排序。。。和排序后位置相同的数就是结果。。too young too simple.直接用数组记录到目前位置左边的最大值和右边的最小值即可(参考了宝典) #include #include...

1101. Quick Sort (25)

题目链接:http://www.patest.cn/contests/pat-a-practise/1101 题目: There is a classical process named ...

【PAT】1101. Quick Sort (25)

There is a classical process named partition in the famous quick sort algorithm. In this process we ...

PAT A1101. Quick Sort (25)

There is a classical process named partition in the famous quick sort algorithm. In this process we ...
  • jolivan
  • jolivan
  • 2017年02月19日 23:12
  • 53

1045.快速排序(25) PAT 乙级&&1101. Quick Sort (25)PAT甲级

著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的N个互不相同的正整数的排列,请问有多...
  • SY_Yu
  • SY_Yu
  • 2016年03月14日 16:08
  • 396
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1101. Quick Sort (25)
举报原因:
原因补充:

(最多只允许输入30个字)