From b72bca7580afd83e405143407bf66df14cbc5052 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sun, 7 Sep 2025 14:30:05 +0900 Subject: [PATCH 01/13] Add topKFrequent method to Solution class Implement topKFrequent method to find top k frequent elements in a list. --- Top K Frequent Elements (retry)/step1.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 Top K Frequent Elements (retry)/step1.py diff --git a/Top K Frequent Elements (retry)/step1.py b/Top K Frequent Elements (retry)/step1.py new file mode 100644 index 0000000..ae34fbf --- /dev/null +++ b/Top K Frequent Elements (retry)/step1.py @@ -0,0 +1,18 @@ +class Solution: + def topKFrequent(self, nums: List[int], k: int) -> List[int]: + count = {} + for num in nums: + count[num] = 1 + count.get(num, 0) + + heap = [] + for num in count.keys(): + heapq.heappush(heap, (count[num], num)) + if len(heap) > k: + heapq.heappop(heap) + + res = [] + for i in range(k): + res.append(heapq.heappop(heap)[1]) + + return res + From b4ad0cd8624eca13576764fa3b51e918c41047e9 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sun, 7 Sep 2025 17:52:39 +0900 Subject: [PATCH 02/13] Implement topKFrequent method using sorting --- .../step2-using-sort.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Top K Frequent Elements (retry)/step2-using-sort.py diff --git a/Top K Frequent Elements (retry)/step2-using-sort.py b/Top K Frequent Elements (retry)/step2-using-sort.py new file mode 100644 index 0000000..ab7b84c --- /dev/null +++ b/Top K Frequent Elements (retry)/step2-using-sort.py @@ -0,0 +1,17 @@ +class Solution: + def topKFrequent(self, nums: List[int], k: int) -> List[int]: + num_to_frequency = {} + for num in nums: + num_to_frequency[num] = 1 + num_to_frequency.get(num, 1) + + frequency_to_num_array = [] + for num, frequency in num_to_frequency.items(): + frequency_to_num_array.append([frequency, num]) + frequency_to_num_array.sort() + + res = [] + while len(res) < k: + res.append(frequency_to_num_array.pop()[1]) + return res + + From fbde086fff574ad5ff59eb6d39992a1de646c481 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sun, 7 Sep 2025 18:03:42 +0900 Subject: [PATCH 03/13] Implement bucket sort for top K frequent elements --- .../step2-using-bucket-sort.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Top K Frequent Elements (retry)/step2-using-bucket-sort.py diff --git a/Top K Frequent Elements (retry)/step2-using-bucket-sort.py b/Top K Frequent Elements (retry)/step2-using-bucket-sort.py new file mode 100644 index 0000000..9af66f4 --- /dev/null +++ b/Top K Frequent Elements (retry)/step2-using-bucket-sort.py @@ -0,0 +1,17 @@ +class Solution: + def topKFrequent(self, nums: List[int], k: int) -> List[int]: + num_to_frequency = {} + frequency_to_nums = [ [] for i in range(len(nums) + 1)] + + for num in nums: + num_to_frequency[num] = 1 + num_to_frequency.get(num, 0) + for num, frequency in num_to_frequency.items(): + frequency_to_nums[frequency].append(num) + + res = [] + for i in range(len(frequency_to_nums) - 1, 0, -1): + for num in frequency_to_nums[i]: + res.append(num) + if len(res) == k: + return res + From 6610a43a32a532c121cbf6a27b5bb18443099dd6 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Thu, 13 Nov 2025 22:57:18 +0900 Subject: [PATCH 04/13] Implement topKFrequent method using a heap --- .../step2-using-heap.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Top K Frequent Elements (retry)/step2-using-heap.py diff --git a/Top K Frequent Elements (retry)/step2-using-heap.py b/Top K Frequent Elements (retry)/step2-using-heap.py new file mode 100644 index 0000000..996bedb --- /dev/null +++ b/Top K Frequent Elements (retry)/step2-using-heap.py @@ -0,0 +1,16 @@ +class Solution: + def topKFrequent(self, nums: List[int], k: int) -> List[int]: + count = {} + for num in nums: + count[num] = 1 + count.get(num, 0) + + heap = [] + for num in count.keys(): + heapq.heappush(heap, (count[num], num)) + if len(heap) > k: + heapq.heappop(heap) + + res = [] + for _ in range(k): + res.append(heapq.heappop(heap)[1]) + return res From 4dae24847753ccda3b70533bf10daa6df76a123e Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sun, 16 Nov 2025 21:25:15 +0900 Subject: [PATCH 05/13] Create step-3-using-bucket-sort.py --- .../step-3-using-bucket-sort.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Top K Frequent Elements (retry)/step-3-using-bucket-sort.py diff --git a/Top K Frequent Elements (retry)/step-3-using-bucket-sort.py b/Top K Frequent Elements (retry)/step-3-using-bucket-sort.py new file mode 100644 index 0000000..fd72b19 --- /dev/null +++ b/Top K Frequent Elements (retry)/step-3-using-bucket-sort.py @@ -0,0 +1,15 @@ +class Solution: + def topKFrequent(self, nums: List[int], k: int) -> List[int]: + counts = {} + frequency_buckets = [[] for _ in range(len(nums) + 1)] + + for num in nums: + counts[num] = 1 + counts.get(num, 0) + for num, cnt in counts.items(): + frequency_buckets[cnt].append(num) + result = [] + for frequency_value in range(len(frequency_buckets) - 1, 0, -1): + for num in frequency_buckets[frequency_value]: + result.append(num) + if len(result) == k: + return result From 05180ec15469e7c462043b40fdc2d42f252473cf Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sun, 16 Nov 2025 21:25:48 +0900 Subject: [PATCH 06/13] Rename step-3-using-bucket-sort.py to step3-using-bucket-sort.py --- .../{step-3-using-bucket-sort.py => step3-using-bucket-sort.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Top K Frequent Elements (retry)/{step-3-using-bucket-sort.py => step3-using-bucket-sort.py} (100%) diff --git a/Top K Frequent Elements (retry)/step-3-using-bucket-sort.py b/Top K Frequent Elements (retry)/step3-using-bucket-sort.py similarity index 100% rename from Top K Frequent Elements (retry)/step-3-using-bucket-sort.py rename to Top K Frequent Elements (retry)/step3-using-bucket-sort.py From 0dfbc218cd5a55aa4459cefffe2e476474e0c7bf Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sun, 16 Nov 2025 22:30:53 +0900 Subject: [PATCH 07/13] Implement topKFrequent method using sorting --- Top K Frequent Elements (retry)/step3-using-sort.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 Top K Frequent Elements (retry)/step3-using-sort.py diff --git a/Top K Frequent Elements (retry)/step3-using-sort.py b/Top K Frequent Elements (retry)/step3-using-sort.py new file mode 100644 index 0000000..4f59f0b --- /dev/null +++ b/Top K Frequent Elements (retry)/step3-using-sort.py @@ -0,0 +1,9 @@ +class Solution: + def topKFrequent(self, nums: List[int], k: int) -> List[int]: + counts = {} + for num in nums: + counts[num] = 1 + counts.get(num, 0) + freq_num_pairs = [(cnt, num) for num, cnt in counts.items()] + freq_num_pairs.sort(reverse=True) + result = [num for _, num in freq_num_pairs[:k]] + return result From c8389169b6f61a8545d834818d1e476f82f1f728 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sun, 16 Nov 2025 22:41:15 +0900 Subject: [PATCH 08/13] Implement topKFrequent using a heap --- .../step3-using-heap.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 Top K Frequent Elements (retry)/step3-using-heap.py diff --git a/Top K Frequent Elements (retry)/step3-using-heap.py b/Top K Frequent Elements (retry)/step3-using-heap.py new file mode 100644 index 0000000..d3bb00e --- /dev/null +++ b/Top K Frequent Elements (retry)/step3-using-heap.py @@ -0,0 +1,14 @@ +class Solution: + def topKFrequent(self, nums: List[int], k: int) -> List[int]: + counts = {} + for num in nums: + counts[num] = 1 + counts.get(num, 0) + heap = [] + for num, freq in counts.items(): + heapq.heappush(heap, (freq, num)) + if len(heap) > k: + heapq.heappop(heap) + result = [] + while heap: + result.append(heapq.heappop(heap)[1]) + return result From e5300f0b185195aeeb6f73b0efaebd80213d389d Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sun, 16 Nov 2025 22:59:46 +0900 Subject: [PATCH 09/13] Create memo.md --- Top K Frequent Elements (retry)/memo.md | 36 +++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 Top K Frequent Elements (retry)/memo.md diff --git a/Top K Frequent Elements (retry)/memo.md b/Top K Frequent Elements (retry)/memo.md new file mode 100644 index 0000000..7fbafad --- /dev/null +++ b/Top K Frequent Elements (retry)/memo.md @@ -0,0 +1,36 @@ +# step1 + +メタ認知でpriority queueを使用しようと思いました。 +ただどうも良いやり方が思いつかず、解答にあったコードを参考にして写経してあります。 + +# step2 + +## Bucket Sort + +Bucket Sortという方法があった。 +2次元配列のインデックスを頻度として使用し、対象インデックスの配列に対して番号を追加していく方式。 + +時間計算量 O(N) + - numsの要素分のループが定数倍回行われるのみなので、O(N)なはず。 +空間計算量 O(N) +- bucket用のリストを確保するので、空間計算量はO(N) + +## Heap + +Min-heapを使う方法。 +Min heapに対して、(頻度,番号)のタプルを追加し、k個以上の要素が追加された場合 heappop する。つまり、heapの中には常に tok k frequent elements のみが存在する状態。 + +時間計算量 O(NlogK) + - heapを構成する要素数は必ずK個以下になるので、O(NlogK)なはず。 +空間計算量 O(N+K) +- N個の要素 + +## Sort + +シンプルにSortする方法 +[頻度,番号]のリストをリストに追加して、ソートする。(あとで突っ込む値はリストからタプルに変えた) + +時間計算量 O(NlogN) + - N個の要素を持つリストをソートするのでNlogNななず。 +空間計算量 O(N) +- N個の要素を持つリストを作成するため。 From 31bdc0f9f9c65ece4b12ca8d3331607a21a410c9 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Wed, 19 Nov 2025 23:34:15 +0900 Subject: [PATCH 10/13] Update memo.md --- Top K Frequent Elements (retry)/memo.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Top K Frequent Elements (retry)/memo.md b/Top K Frequent Elements (retry)/memo.md index 7fbafad..511107d 100644 --- a/Top K Frequent Elements (retry)/memo.md +++ b/Top K Frequent Elements (retry)/memo.md @@ -5,6 +5,17 @@ # step2 +## 典型コメント集をみて + +- https://discord.com/channels/1084280443945353267/1235829049511903273/1245555256360697949 + - Counterを使うのはいいが、その実装を理解しているかが出題者の意図なのでは + - dictを初期化、その後listを作成しsortして上位何件かを取るという処理ができているか +- https://discord.com/channels/1084280443945353267/1183683738635346001/1185972070165782688 + - QuickSelectというアルゴリズムがある + - https://www.geeksforgeeks.org/dsa/quickselect-algorithm/ + + + ## Bucket Sort Bucket Sortという方法があった。 From bbf1111ad125f22e98159159613df564f56ee48a Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Wed, 19 Nov 2025 23:34:36 +0900 Subject: [PATCH 11/13] Implement Quickselect for Top K Frequent Elements --- .../step2-using-quickselect.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Top K Frequent Elements (retry)/step2-using-quickselect.py diff --git a/Top K Frequent Elements (retry)/step2-using-quickselect.py b/Top K Frequent Elements (retry)/step2-using-quickselect.py new file mode 100644 index 0000000..cbe7e75 --- /dev/null +++ b/Top K Frequent Elements (retry)/step2-using-quickselect.py @@ -0,0 +1,44 @@ +class Solution: + def topKFrequent(self, nums: List[int], k: int) -> List[int]: + counts = {} + for num in nums: + counts[num] = 1 + counts.get(num, 0) + items = list(counts.items()) + n = len(items) + + if k >= n: + return [num for num, _ in items] + + target = n - k + + def partition(left: int, right: int, pivot_index: int) -> int: + pivot_freq = items[pivot_index][1] + + items[pivot_index], items[right] = items[right], items[pivot_index] + store_index = left + + for i in range(left, right): + if items[i][1] < pivot_freq: + items[store_index], items[i] = items[i], items[store_index] + store_index += 1 + items[store_index], items[right] = items[right], items[store_index] + return store_index + + def quickselect(left: int, right: int, k_smallest: int) -> None: + if left == right: + return + pivot_index = random.randint(left, right) + pivot_index = partition(left, right, pivot_index) + + if k_smallest == pivot_index: + return + elif k_smallest < pivot_index: + quickselect(left, pivot_index - 1, k_smallest) + else: + quickselect(pivot_index + 1, right, k_smallest) + + quickselect(0, n - 1, target) + top_k_nums = [num for num, _ in items[target:]] + return top_k_nums + + From 7a4d2bf889b5bceeb19453babdce54f146638ec3 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Tue, 25 Nov 2025 23:00:14 +0900 Subject: [PATCH 12/13] Update terminology in memo.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrected terminology from 'メタ認知' to 'メタ情報' in memo. --- Top K Frequent Elements (retry)/memo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Top K Frequent Elements (retry)/memo.md b/Top K Frequent Elements (retry)/memo.md index 511107d..b68d3a3 100644 --- a/Top K Frequent Elements (retry)/memo.md +++ b/Top K Frequent Elements (retry)/memo.md @@ -1,6 +1,6 @@ # step1 -メタ認知でpriority queueを使用しようと思いました。 +メタ情報でpriority queueを使用しようと思いました。 ただどうも良いやり方が思いつかず、解答にあったコードを参考にして写経してあります。 # step2 From 13cd2a3c3a452c8b1f22a79b11589949d8f2eb72 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Tue, 25 Nov 2025 23:08:40 +0900 Subject: [PATCH 13/13] Implement topKFrequent method using sorting --- Top K Frequent Elements (retry)/step4-using-sort.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Top K Frequent Elements (retry)/step4-using-sort.py diff --git a/Top K Frequent Elements (retry)/step4-using-sort.py b/Top K Frequent Elements (retry)/step4-using-sort.py new file mode 100644 index 0000000..c7ce920 --- /dev/null +++ b/Top K Frequent Elements (retry)/step4-using-sort.py @@ -0,0 +1,10 @@ +class Solution: + def topKFrequent(self, nums: List[int], k: int) -> List[int]: + counts = {} + for num in nums: + counts[num] = 1 + counts.get(num, 0) + frequency_num_pairs = [] + for key, cnt in counts.items(): + frequency_num_pairs.append((cnt, key)) + frequency_num_pairs.sort(reverse=True) + return [num for _, num in frequency_num_pairs[:k]]