问题描述 :
设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。
请实现 KthLargest 类:
KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。
解题
暴力快排会TLE
花了一小时了解了小顶堆才写出来这玩意
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
int cmp(const void* a, const void* b) {//快排 从大到小
return (*(long long*)b) - (*(long long*)a);
}
class KthLargest
{
private:
int k;
priority_queue<int, vector<int>, greater<int>> quene;
public:
KthLargest(int k, int nums[]) :k(k) {
int i = 0;
for (i = 0; i < k; i++)
add1(nums[i]);
}
int add1(int val) {
quene.push(val);
if (quene.size() > k) {
quene.pop();
}
return quene.top();
}
int add(int val) {
quene.push(val);
if (quene.size() > k) {
quene.pop();
}
printf("%d\n", quene.top());
return quene.top();
}
};
int main()
{
int k, n, i;
int s[10001] = { 0 };
cin >> k >> n;
for (i = 0; i < n; i++)
cin >> s[i];
qsort(s, n, sizeof(s[0]), cmp);
KthLargest K(k, s);
string str; int val = 0;
while (cin>>str) {
scanf("%d", &val);
K.add(val);
}
return 0;
}