1. 程式人生 > 實用技巧 >703. 資料流中的第K大元素

703. 資料流中的第K大元素

703. 資料流中的第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 個元素的小頂堆,堆頂元素即為所求。每次遇到新元素時,若該元素比堆頂元素大,則刪除堆頂元素,加入新元素,否則不做處理。

程式碼:

class KthLargest {
    priority_queue<int, vector<int>, greater<int>> Q;
    int flag;
public:
    KthLargest(int k, vector<int>& nums) {
        int i, len = nums.size();
        if(len < k)
        {
            flag = 0;
            for(i = 0; i < len; i++)
            {
                Q.push(nums[i]);
            }
        }
        
else { flag = 1; for(i = 0; i < k; i++) { Q.push(nums[i]); } for(i = k; i < len; i++) { if(nums[i]>Q.top()) { Q.pop(); Q.push(nums[i]); } } } }
int add(int val) { if(flag == 0) { flag = 1; Q.push(val); } else { if(val>Q.top()) { Q.pop(); Q.push(val); } } return Q.top(); } }; /** * Your KthLargest object will be instantiated and called as such: * KthLargest* obj = new KthLargest(k, nums); * int param_1 = obj->add(val); */