diff --git a/703. Kth Largest Element in a Stream.md b/703. Kth Largest Element in a Stream.md new file mode 100644 index 0000000..9719031 --- /dev/null +++ b/703. Kth Largest Element in a Stream.md @@ -0,0 +1,101 @@ +# step1 +- リストにinputとなる数値を追加していく +- リストのソートをして、小さい順なら-k番目、大きい順ならk番目を出力する +- 書いてみてエラーがいくつか出たので修正 + - コンストラクタ内でself.変数=値とすることで、値とインスタンスを紐づけて格納する。selfはインスタンス自身を指すので、インスタンスが複数あっても、値を別々に保持できる。 + - sortとsortedでソートできる。sortは元のリスト自身を並び替える、sorted(リスト)は元を変えずに新しい並び替えリストを返す。sortedだと変数が増えるのでsortを選択。 + - + +```python +class KthLargest: + + def __init__(self, k: int, nums: List[int]): + self.kth = k + self.score_list = nums + + def add(self, val: int) -> int: + self.score_list.append(val) + self.score_list.sort() + return self.score_list[-self.kth] +``` + + +# step2 +- https://github.com/mura0086/arai60/pull/13#discussion_r2002989542 +- https://ensta-blog.com/python/heapq/ + - 最小ヒープ: 優先度が最小の要素が先に取り出される + - headpq.heapify リストを渡すと最小ヒープに変換される。 +- >この問題、手でやるならどうしますかね。たとえば、レールの上をボールが次々と転がってきて、大きい方から5つ持って帰りたいとします。 +- 5番目に大きい数を見たいときに、インプットが[3,2,4,7,6,5,8]だとして、4が5番目に大きい。5個保持するとして最初の5個をソートすると[2,3,4,6,7]。大きいものを保持したいので、インプットの5がきたら、[3,4,5,6,7]。8がきたら、[4,5,6,7,8]。最終的に最小値を見ると5番目に大きい4となる。 +- コメント書きつつ流れを理解 + +```python +class KthLargest: + def __init__(self, k: int, nums: List[int]): + self.k = k + self.top_k = nums[:k] #先頭k個を取り出す + heapq.heapify(self.top_k) #最小ヒープに変換 + for i in range(k, len(nums)): + heapq.heappushpop(self.top_k,nums[i]) #nums[i]の値をpushして最小値をpopする + + def add(self, val: int) -> int: + heapq.heappush(self.top_k, val) #ヒープにval追加 + if len(self.top_k) > self.k: # k個よりもヒープが大きい場合 + heapq.heappop(self.top_k) #ヒープの最小の値をpopする + return self.top_k[0] #ヒープの最小値がk番目に大きい値 + +``` + +# step3 + +```python +class KthLargest: + + def __init__(self, k: int, nums: List[int]): + self.k = k + self.top_k = nums[:k] + heapq.heapify(self.top_k) + for i in range(k,len(nums)): + heapq.heappushpop(self.top_k,nums[i]) + + def add(self, val: int) -> int: + heapq.heappush(self.top_k,val) + if len(self.top_k) > self.k: + heapq.heappop(self.top_k) + return self.top_k[0] +``` +```python +class KthLargest: + + def __init__(self, k: int, nums: List[int]): + self.k = k + self.top_k = nums[:k] + heapq.heapify(self.top_k) + for i in range(k,len(nums)): + heapq.heappushpop(self.top_k,nums[i]) + + + def add(self, val: int) -> int: + heapq.heappush(self.top_k,val) + if len(self.top_k) > self.k: + heapq.heappop(self.top_k) + return self.top_k[0] + +``` +```python +class KthLargest: + + def __init__(self, k: int, nums: List[int]): + self.k = k + self.top_k = nums[:k] + heapq.heapify(self.top_k) + for i in range(k, len(nums)): + heapq.heappushpop(self.top_k,nums[i]) + + def add(self, val: int) -> int: + heapq.heappush(self.top_k,val) + if len(self.top_k) > self.k: + heapq.heappop(self.top_k) + return self.top_k[0] + +```