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。

import heapq


class KthLargest(object):

    def __init__(self, k, nums):
        """
        :type k: int
        :type nums: List[int]
        """
        self.heap = []
        self.k = k
        if nums:
            if len(nums) < k:
                for i in range(len(nums)):
                    heapq.heappush(self.heap, nums[i])
            else:
                for i in range(k):
                    heapq.heappush(self.heap, nums[i])
                for j in range(k, len(nums)):
                    top = self.heap[0]
                    if nums[j] > top:
                        heapq.heapreplace(self.heap, nums[j])

    def add(self, val):
        """
        :type val: int
        :rtype: int
        """
        if not self.heap:
            heapq.heappush(self.heap, val)
            return self.heap[0]
        if self.k > len(self.heap):
            heapq.heappush(self.heap, val)
            if self.k == len(self.heap):
                return self.heap[0]
            return
        else:
            if val > self.heap[0]:
                heapq.heapreplace(self.heap, val)
            return self.heap[0]



# Your KthLargest object will be instantiated and called as such:
# obj = KthLargest(k, nums)
# param_1 = obj.add(val)