数据流中第 K 大的元素(leetcode 703)

一:解题思路

在C++和Java中,使用最小堆或者最大堆,用一个优先队列即可。构造函数:Time:O(n*log(k)),添加函数:Time:O(log(k))

二:完整代码示例 (C++、Java、Python)

C++:

class KthLargest 
{
private:
    priority_queue<int, vector<int>,greater<int>> minHeap;//默认为最大堆,所以后面要添加greater变为最小堆
    int k;
public:
    KthLargest(int k, vector<int>& nums) 
    {
        this->k = k;
        for (int num : nums) add(num);
    }

    int add(int val) 
    {
        if (minHeap.size() < k) minHeap.push(val);
        else if (val > minHeap.top())
        {
            minHeap.pop();
            minHeap.push(val);
        }

        return minHeap.top();
    }
};

Java:

class KthLargest
    {
        private Queue<Integer> minHeap=new PriorityQueue<>();
        private int k;
        
        public KthLargest(int k, int[] nums)
        {
               this.k=k;
               for(int num:nums) add(num);
        }

        public int add(int val)
        {
              if(minHeap.size()<k) minHeap.add(val);
              else if(val>minHeap.peek())
              {
                  minHeap.poll();
                  minHeap.add(val);
              }
              
              return minHeap.peek();
        }
    }

Python:

 

import heapq
class KthLargest:

    def __init__(self, k: int, nums: List[int]):
        self.k=k
        self.heap=nums
        heapq.heapify(self.heap)
        while len(self.heap)>k:
            heapq.heappop(self.heap)

    def add(self, val: int) -> int:
        
        if len(self.heap)<self.k:
            heapq.heappush(self.heap,val)
        elif self.heap[0]<val:
            heapq.heapreplace(self.heap,val)
        
        return self.heap[0]

 

posted @ 2020-04-08 16:51  repinkply  阅读(162)  评论(0)    收藏  举报