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) Returns the element representing the kth largest element in the stream.

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, 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

Constraints:

  • 1 <= k <= 10^4
  • 0 <= nums.length <= 10^4
  • 10^4 <= nums[i] <= 10^4
  • -10^4 <= val <= 10^4
  • At most 10^4 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 k^{th} element.

Solution in python:

class KthLargest:

    def __init__(self, k: int, nums: List[int]):
        self.queue = []
        self.size = 0
        self.maxsize = k
        for item in nums:
            self.add(item)

    def add(self, val: int) -> int:
        if self.size == 0:
            self.queue.append(val)
            self.size += 1
        elif self.size < self.maxsize:
            i = 0
            while i < self.size and val >= self.queue[i]:
                i += 1
            self.queue.insert(i, val)
            self.size += 1
        elif val < self.queue[0]:
            return self.queue[0]
        else:
            i = 0
            while i < self.size and val >= self.queue[i]:
                i += 1
            self.queue.insert(i, val)
            self.queue.pop(0)
        return self.queue[0]

# Your KthLargest object will be instantiated and called as such:
# obj = KthLargest(k, nums)
# param_1 = obj.add(val)
最后修改日期: 2021年2月5日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。