Kth Largest Element in a Stream 数据流中的第K大元素

设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。

你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。

示例:

int k = 3;
int[] arr = [4,5,8,2];
KthLargest kthLargest = new KthLargest(3, arr);
kthLargest.add(3);   // returns 4
kthLargest.add(5);   // returns 5
kthLargest.add(10);  // returns 5
kthLargest.add(9);   // returns 8
kthLargest.add(4);   // returns 8

说明: 
你可以假设 nums 的长度≥ k-1 且k ≥ 1。

思路:我们可以用一个最小堆来做,并且限制堆的大小为k,初始化时把nums的每个数都push到堆中,如果堆的大小大于k,就pop一个元素。对于add方法也是同理。

参考代码:

class KthLargest {
public:
	KthLargest(int k, vector nums) {
		size = k;
		for (int i = 0; i < nums.size(); i++) {
			heap.push(nums[i]);
			if (heap.size() > k) heap.pop();
		}
	}
	int add(int val) {
		heap.push(val);
		if (heap.size() > size) heap.pop();
		return heap.top();
	}
private:
	priority_queue, greater> heap;
	int size;
};

/**
 * Your KthLargest object will be instantiated and called as such:
 * KthLargest obj = new KthLargest(k, nums);
 * int param_1 = obj.add(val);
 */

 

你可能感兴趣的:(算法)