#include <iostream>
#include <vector>
#include <functional>
#include <queue>
using namespace std;
class Demo {
public:
int data;
string name;
Demo(int _data, string _name):data(_data),name(_name){}
};
/*
struct Demo_Comp {
bool operator()(pair<int, Demo*>& p1, pair<int, Demo*>& p2) {
return ((p1.second)->name < (p2.second)->name);
}
};
*/
// 自顶底堆的排序规则
struct Demo_Comp {
bool operator()(pair<int, Demo*>& p1, pair<int, Demo*>& p2) {
// 默认 name 排序,name 相等 data 排序,data 相等 first 排序
if ((p1.second)->name != (p2.second)->name) {
return ((p1.second)->name < (p2.second)->name);
} else if ((p1.second)->data != (p2.second)->data){
return ((p1.second)->data < (p2.second)->data);
} else {
return p1.first < p2.first;
}
}
};
int main()
{
Demo *d1 = new Demo(30, "hello");
Demo *d2 = new Demo(30, "hello");
Demo *d3 = new Demo(30, "hello");
Demo *d4 = new Demo(65, "hello");
Demo *d5 = new Demo(41, "world");
Demo *d6 = new Demo(41, "world");
Demo *d7 = new Demo(20, "world");
Demo *d8 = new Demo(41, "demo");
priority_queue<pair<int, Demo*>, vector<pair<int, Demo*> >, Demo_Comp> p;
p.push(make_pair(1, d1));
p.push(make_pair(1, d2));
p.push(make_pair(2, d3));
p.push(make_pair(2, d4));
p.push(make_pair(3, d5));
p.push(make_pair(1, d6));
p.push(make_pair(5, d7));
p.push(make_pair(9, d8));
while(!p.empty()) {
cout << ((p.top()).second)->name << ", "
<< ((p.top()).second)->data << ", "
<< (p.top()).first << endl;
p.pop();
}
delete d1;
delete d2;
delete d3;
delete d4;
delete d5;
delete d6;
delete d7;
delete d8;
return 0;
}
world, 41, 3
world, 41, 1
world, 20, 5
hello, 65, 2
hello, 30, 2
hello, 30, 1
hello, 30, 1
demo, 41, 9
// 面试题
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;
void printV(vector<int>& v){
for(int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
}
vector<int> minTopK(vector<int>& v, int K) {
vector<int> tmp(v.begin(), v.begin() + K);
// 默认是大顶堆
// 顶部是最小K个元素的最大值
make_heap(tmp.begin(), tmp.begin() + K);
for (int i = v[K]; i < v.size(); i++) {
if (v[i] < tmp[0]) {
pop_heap(tmp.begin(), tmp.end()); // 把最大的元素放到最后 //
tmp[K-1] = v[i]; // 将最后一个元素进行替换
push_heap(tmp.begin(), tmp.end());// 重新调整堆
}
}
return vector<int>(tmp.begin(), tmp.begin() + K);
}
int main()
{
vector<int> demo;
vector<int> ret;
for(int i = 0; i < 10000; i++) {
demo.push_back((3 * i + 1)%5001);
}
for(int i = 0; i < 10000; i++) {
demo.push_back((5 * i + 2)%5001);
}
for(int i = 0; i < 10000; i++) {
demo.push_back((7 * i + 4)%5001);
}
ret = minTopK(demo, 10);
for(int i = 0; i < ret.size(); i++) {
cout << ret[i] << " ";
}
cout << endl;
return 0;
}