LeetCode703. Kth Largest Element in a Stream(优先队列)

题目描述:

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.

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

Note: 
You may assume that nums' length ≥ k-1 and k ≥ 1.

可以使用类似快排的递归利用partition方法的方法求解,具体参考在另一篇博客介绍partition方法,及利用其进行快速排序,输出最小的k个值等操作

本篇博客使用优先级队列priority_queue<Type, Container, Functional>进行求解 

首先介绍priority_queue<Type, Container,Functional>

Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式。

当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆

1 //升序队列
2 priority_queue <int,vector<int>,greater<int> > q;
3 //降序队列
4 priority_queue <int,vector<int>,less<int> >q;
5 
6 //greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

具体做法就是维护一个大小为k的优先级队列(最小堆,堆顶为最小值),每新来一个元素就与堆顶元素比较

若比堆顶元素小,则跳过不管,进入下一个元素操作

若比堆顶元素大,则优先级队列先pop,然后让该元素push

代码:

class KthLargest {
public:
    int k_num;
    int n;
    priority_queue<int, vector<int>, greater<int>> qmin;
    KthLargest(int k, vector<int>& nums) {
        k_num = k;
        n = nums.size();
        if(n >= k){
            for(int i = 0; i < k; i ++){
                qmin.push(nums[i]);
            }
            for(int i = k; i < n; i ++){
                int kmax = qmin.top();
                if(nums[i] > kmax){
                    qmin.pop();
                    qmin.push(nums[i]);
                }
            }
        }
        else{
            for(int i = 0; i < n; i ++)qmin.push(nums[i]);
        }
    }
    
    int add(int val) {
        if(k_num > n){
            qmin.push(val);
            n ++;
        }
        else{
            int kmax = qmin.top();
            if(val > kmax){
                qmin.pop();
                qmin.push(val);
            }
            n ++;
        }
        if(k_num > n)return -1;
        else return qmin.top();
    }
};

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值