Solving Leetcode Interviews in Seconds with AI: Kth Largest Element in a Stream
Introduction
In this blog post, we will explore how to solve the LeetCode problem "703" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.
Problem Statement
You are part of a university admissions office and need to keep track of the kth highest test score from applicants in real-time. This helps to determine cut-off marks for interviews and admissions dynamically as new applicants submit their scores. You are tasked to implement a class which, for a given integer k, maintains a stream of test scores and continuously returns the kth highest test score after a new score has been submitted. More specifically, we are looking for the kth highest score in the sorted list of all scores. Implement the KthLargest class: KthLargest(int k, int[] nums) Initializes the object with the integer k and the stream of test scores nums. int add(int val) Adds a new test score val to the stream and returns the element representing the kth largest element in the pool of test scores so far. 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 Example 2: Input: ["KthLargest", "add", "add", "add", "add"] [[4, [7, 7, 7, 7, 8, 3]], [2], [10], [9], [9]] Output: [null, 7, 7, 7, 8] Explanation: KthLargest kthLargest = new KthLargest(4, [7, 7, 7, 7, 8, 3]); kthLargest.add(2); // return 7 kthLargest.add(10); // return 7 kthLargest.add(9); // return 7 kthLargest.add(9); // return 8 Constraints: 0 <= nums.length <= 104 1 <= k <= nums.length + 1 -104 <= nums[i] <= 104 -104 <= val <= 104 At most 104 calls will be made to add.
Explanation
Here's a breakdown of the solution and the Python code:
Key Approach:
- Use a min-heap (priority queue) to store the k largest elements seen so far.
- When a new element is added: If the heap size is less than k, add the element. Otherwise, if the element is greater than the smallest element in the heap, remove the smallest element and add the new element.
- The root of the min-heap will always be the kth largest element.
Complexity:
- Runtime: O(log k) for each
addoperation. O(nlogk) to initialize the KthLargest object with n elements, where n is the size of nums. - Storage: O(k) to store the heap.
- Runtime: O(log k) for each
Code
import heapq
class KthLargest:
def __init__(self, k: int, nums: list[int]):
self.k = k
self.heap = []
for num in nums:
self.add(num)
def add(self, val: int) -> int:
if len(self.heap) < self.k:
heapq.heappush(self.heap, val)
elif val > self.heap[0]:
heapq.heapreplace(self.heap, val)
return self.heap[0]