703. Kth Largest Element in a Stream

406 篇文章 0 订阅
406 篇文章 0 订阅

1,题目要求
Design a class to find the kth largest element in a stream. Note that it is the kth largest element in the sorted order, not the kth distinct element.

Your KthLargest class will have a constructor which accepts an integer k and an integer array nums, which contains initial elements from the stream. For each call to the method KthLargest.add, return the element representing the kth largest element in the stream.
这里写图片描述
设计一个类来查找流中第k个最大元素。

2,题目思路
对于这道题,一开始是直接想用一个vector作为容器,然后在每次插入时都进行排序,最后直接取第k个元素即可。但是这种做法会使得时间开销很大(因为每插入一个数据都会进行一次排序),因此不可行。
因此,对于这道题,利用到了一种新的容器:priority_queue

  • priority_queue 优先队列,其底层是用堆(heap)来实现的。在优先队列中,队首元素一定是当前队列中优先级最高的那一个。

  • 在优先队列中,没有 front() 函数与 back() 函数,而只能通过 top() 函数来访问队首元素(也可称为堆顶元素),也就是优先级最高的元素。

  • 在定义时,可以直接进行定义(如果使用默认的优先级——从大到小):

priority_queue<int> pq;
  • 也可以自定义优先级:
priority_queue<int, vector<int>, less<int> > pq;
//其中,第二个参数( vector ),是来承载底层数据结构堆的容器;
//第三个参数( less ),则是一个比较类,less 表示数字大的优先级高,而 greater 表示数字小的优先级高。
//也就是说,less还是表示从大到小,greater则表示从小到大

参考文章:
priority_queue详解

因此,对于这道题,我们就定义一个大小始终维持在k的一个这样的priority_queue,让其内部的堆按照从大到小的顺序进行安排,这样top就一定是第k大的数字了。
对于长度的维持,即在长度超过k时,pop一下即可。

3,程序源码

static int pr = []() { 
    std::ios::sync_with_stdio(false); 
    cin.tie(NULL);  
    return 0; 
}();

class KthLargest {
public:
    KthLargest(int k, vector<int> nums) {
        kth = k;
        for(auto n : nums)
        {
            pq.push(n);
            if(pq.size()>kth)   pq.pop();
        }
    }

    int add(int val) {
        pq.push(val);
        if(pq.size()>kth)   pq.pop();
        return pq.top();
    }

private:
    priority_queue<int, vector<int>, greater<int>> pq;
    int kth;
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值