# 703. Kth Largest Element in a Stream ###### tags: `Python`,`Leetcode` https://leetcode.com/problems/kth-largest-element-in-a-stream/description/ ## Code ```python= class KthLargest: def __init__(self, k: int, nums: List[int]): self.heap = nums self.k = k heapq.heapify(self.heap) def add(self, val: int) -> int: heapq.heappush(self.heap, val) while len(self.heap) > self.k: heapq.heappop(self.heap) return self.heap[0] ``` ## 題意 * 這個題目要求設計一個類別,能夠在一個數字流中找到第 k 大的數字。初始化時,我們需要提供一個整數 k 和一個數字陣列 nums,這個陣列代表了一個初始的數字流。 * 使用 add 方法來向這個數字流中添加新的數字。每次呼叫方法時,它會將數字 val 添加到流中,並返回目前為止流中的第 k 大的數字 ## 思路 * 其實這題難度雖然歸類在 `Easy` ,但我其實覺得蠻難的 XD,因為用到 Heap,我其實因為很少用掌握得不太好,所以我也是看別人的 solution 來的 * 初始化函式 __init__ : 1. 先將 nums 轉換為一個最小堆,使用了 heapq.heapify 函式來完成這個操作 2. 將最小堆存儲在類別的成員變數 self.heap 中,同時保存 k 的值在 self.k 中 * 函式 add: 1. heapq.heappush 將新的數字 val 加入到最小堆中 2. 如果最小堆的大小超過了k,我們需要刪除堆中的一些元素。使用heapq.heappop 來刪除最小堆的根節點,直到最小堆的大小等於 k 3. 最後,返回最小堆的根節點,即為目前為止流中的第 k 大的數字 ## 補充 * `heapq.heapify` 函式的作用是將一個可變序列(例如列表)轉換成最小堆的形式 * `heapq.heappush` 函式接受兩個參數:一個堆物件(如列表或其他支援可變序列操作的物件)和一個要添加到堆中的元素 * `heapq.heappop` 函式接受一個堆物件(如列表或其他支援可變序列操作的物件)作為參數,並從堆中移除並返回最小的元素