Problem statement

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.

Implement KthLargest class:

  • KthLargest(int k, int[ ] nums) Initializes the object with the integer k and the stream of integers nums
  • int add (int val) Appends the integer val to the stream and returns the element representing the kth largest element in the stream.

Examples

Example 1

Input
[“KthLargest”, “add”, “add”, “add”, “add”, “add”]
[[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]]
Output
[null, 4, 5, 5, 8, 8]

Explanation
KthLargest kthLargest = new KthLargest (3, [4, 5, 8, 21]);
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

Constraints:

  • 1 <= k <= 104
  • 0 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • -104 <= val <= 104
  • At most 104 calls will be made to add.
  • It is guaranteed that there will be at least k elements in the array when you search for the kth element.

Implementation

import heapq 

class KthLargest:

    def __init__(self, k, nums):
        self.num = nums
        self.k = k 
        heapq.heapify(self.num) # O(n)
        while len(self.num) > k:
            heapq.heappop(self.num) 

    def add(self, val):
        heapq.heappush(self.num, val)
        if len(self.num) > self.k: 
            heapq.heappop(self.num) 
        print(self.num[0])
        return self.num[0] 

kthLargest = 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

Complexity

Time: O(n)
Time:O(n)
Where n in the length of the input array nums.s