【算法练习】leetcode每日一题/ 中位数题目相关/选择合适的ds/经典topK

目录

 

703. 数据流中的第 K 大元素

思路

代码


703. 数据流中的第 K 大元素

难度简单198

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

请实现 KthLargest 类:

  • KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
  • int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。

 

示例:

输入:
["KthLargest", "add", "add", "add", "add", "add"]
[[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]]
输出:
[null, 4, 5, 5, 8, 8]

解释:
KthLargest kthLargest = new KthLargest(3, [4, 5, 8, 2]);
kthLargest.add(3);   // return 4
kthLargest.add(5);   // return 5
kthLargest.add(10);  // return 5
kthLargest.add(9);   // return 8
kthLargest.add(4);   // return 8

 

提示:

  • 1 <= k <= 104
  • 0 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • -104 <= val <= 104
  • 最多调用 add 方法 104 次
  • 题目数据保证,在查找第 k 大元素时,数组中至少有 k 个元素

 

思路

选择合适的数据结构

①multiset 

②size为k的小顶堆

 

代码

①multiset 

在 C++ 中 set/multiset 是有序的集合,它们是基于红黑树实现的。其中 set 会对元素去重,而 multiset 可以有重复元素。

class KthLargest {
    int k;
public:
    vector nums;
    multiset st;   //注意不要去重
    int size;
    KthLargest(int k, vector& nums) {
    for (int i = 0; i < nums.size(); ++i) {
        st.insert(nums[i]);
    }
    this->size=nums.size();
    this->k=k;
    }
    
    int add(int val) {
        st.insert(val);
        size++;
        auto it=st.begin();
        advance(it,size-k);
        return *it;
    }
};

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

②size为k的小顶堆 【topK经典做法】

class KthLargest {
    int k;
public:
    vector nums;
    priority_queue, greater > pq; //最小堆
    int size;
    KthLargest(int k, vector& nums) {
    size=0;
    for (int i = 0; i < nums.size(); ++i) {
        pq.push(nums[i]);
        size++;
    }
    while(size>k){
        pq.pop();
        size--;
    }
    this->k=k;
    }
    
    int add(int val) {
        pq.push(val);
        size++;
        if(size>k){
        pq.pop();
        size--;
         }
        return pq.top();
    }
};

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

时间复杂度:

初始化时间复杂度为:O(nlogk) ,其中 n 为初始化时 nums 的长度;

单次插入时间复杂度为:O(logk)。

空间复杂度:O(k)。需要使用优先队列存储前 k大的元素。

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/kth-largest-element-in-a-stream/solution/shu-ju-liu-zhong-de-di-k-da-yuan-su-by-l-woz8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

延伸阅读:拜托,面试别再问我TopK了!!!

你可能感兴趣的:(算法练习,算法,数据结构,leetcode)