From f2c76ac3f2794d26d3746ecd17e0078253739fbe Mon Sep 17 00:00:00 2001 From: Sangeeth Sudheer Date: Sat, 9 Apr 2022 01:21:26 +0530 Subject: [PATCH] feat(0789_kth-largest-element-in-a-stream): add py3 soln --- .../README.md | 32 +++++++++++++ .../python3/naive_approach_tle.py | 45 +++++++++++++++++++ .../python3/solution.py | 26 +++++++++++ 3 files changed, 103 insertions(+) create mode 100644 0789_kth-largest-element-in-a-stream/README.md create mode 100644 0789_kth-largest-element-in-a-stream/python3/naive_approach_tle.py create mode 100644 0789_kth-largest-element-in-a-stream/python3/solution.py diff --git a/0789_kth-largest-element-in-a-stream/README.md b/0789_kth-largest-element-in-a-stream/README.md new file mode 100644 index 0000000..4b45087 --- /dev/null +++ b/0789_kth-largest-element-in-a-stream/README.md @@ -0,0 +1,32 @@ +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. + +**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 <= 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. \ No newline at end of file diff --git a/0789_kth-largest-element-in-a-stream/python3/naive_approach_tle.py b/0789_kth-largest-element-in-a-stream/python3/naive_approach_tle.py new file mode 100644 index 0000000..1324227 --- /dev/null +++ b/0789_kth-largest-element-in-a-stream/python3/naive_approach_tle.py @@ -0,0 +1,45 @@ +# Naive approach, will TLE +# Time for each add: O(k) +class KthLargest: + + def __init__(self, k: int, nums: List[int]): + self.k = k + + len_nums = len(nums) + + # Only keep max k elements, rest are useless + if len_nums >= k: + self.nums = sorted(nums)[len_nums - k:] + # If we're provided less than k elements, we + # will it up with least possible number + else: + self.nums = [ + *([float("-inf")] * (k - len_nums)), + *sorted(nums) + ] + + def add(self, val: int) -> int: + # Find the right place for val in the list + # of length k + + i = self.k - 1 + while i >= 0 and val < self.nums[i]: + i -= 1 + + # If val is big enough to fit in the list, shift + # existing elements to left + j = 0 + while j < i: + self.nums[j] = self.nums[j + 1] + j += 1 + + if i >= 0: + self.nums[i] = val + + # kth largest element is always at index 0 + return self.nums[0] + + +# Your KthLargest object will be instantiated and called as such: +# obj = KthLargest(k, nums) +# param_1 = obj.add(val) diff --git a/0789_kth-largest-element-in-a-stream/python3/solution.py b/0789_kth-largest-element-in-a-stream/python3/solution.py new file mode 100644 index 0000000..9eab985 --- /dev/null +++ b/0789_kth-largest-element-in-a-stream/python3/solution.py @@ -0,0 +1,26 @@ +import heapq + +class KthLargest: + + def __init__(self, k: int, nums: List[int]): + self.k = k + self.heap = nums + heapq.heapify(self.heap) + + # Keep removing elements until heap size is k + while len(self.heap) > k: + heapq.heappop(self.heap) + + + def add(self, val: int) -> int: + heapq.heappush(self.heap, val) + + if len(self.heap) > self.k: + heapq.heappop(self.heap) + + return self.heap[0] + + +# Your KthLargest object will be instantiated and called as such: +# obj = KthLargest(k, nums) +# param_1 = obj.add(val)