iT邦幫忙

2026 iThome 鐵人賽

DAY 27
0
自我挑戰組

30天 LeetCode 演算法實戰:Java 與 Python 解法比較系列 第 27 篇

Day 27|Top K Frequent Elements:Java 與 Python 實作 Hash Table + Heap

  • 分享至 

  • xImage
  •  

一、題目介紹
今天要練習的是LeetCode 347:Top K Frequent Elements

題目給定一個整數陣列nums,以及一個整數k,要求找出陣列中出現頻率最高的k個元素

例如:
nums = [1,1,1,2,2,3]
k = 2

統計每個數字出現的次數:
1 → 3 次
2 → 2 次
3 → 1 次

因此出現次數最高的兩個元素就是:[1,2]

二、解題想法:Hash Table + Heap
這題可以分成兩個步驟:

第一步:使用Hash Table統計頻率
先把每個數字出現的次數統計起來

例如:nums = [1,1,1,2,2,3]
得到:
1 → 3
2 → 2
3 → 1

這部分可以使用:

  • Java:HashMap
  • Python:dict

第二步:使用Min Heap找出Top K
有了每個數字的出現次數後,就可以利用Min Heap
我們讓Heap最多保留k個元素

例如:k = 2
依序放入:
1 → 3
2 → 2
3 → 1
當Heap超過2個元素時,就移除頻率最低的元素
最後留下:
1 → 3
2 → 2
也就是出現頻率最高的兩個元素

三、Java實作
https://ithelp.ithome.com.tw/upload/images/20260911/20178669XMdgl07Ren.png

https://ithelp.ithome.com.tw/upload/images/20260911/201786690lWX0gYNvI.png

四、Python實作
https://ithelp.ithome.com.tw/upload/images/20260911/20178669wScUgVIdjj.png

https://ithelp.ithome.com.tw/upload/images/20260911/20178669a1w0arqpIj.png

五、Java與Python比較
https://ithelp.ithome.com.tw/upload/images/20260911/20178669NT0jkRO2Js.png

這一題最大的收穫就是把兩種資料結構結合起來使用

Hash Table 負責:「誰出現幾次?」
Heap 負責:「誰是出現最多的Top K?」

兩個各自負責不同工作,合作起來就能有效率地解決問題

六、時間與空間複雜度
假設陣列共有n個元素,而不同元素的數量為m

Hash Table統計
遍歷整個陣列:O(n)

Heap
最多有m個不同元素,每個元素進入Heap時需要:O(log k)
因此O(m log k)
整體時間複雜度可以表示為:O(n + m log k)
因為m ≤ n
也可以簡化理解為:O(n log k)
在實際分析時,寫O(n + m log k)會更加精確

空間複雜度
Hash Table最多儲存m個不同元素:O(m)
Heap 最多儲存k個元素:O(k)
所以額外空間為:O(m + k)

七、實作結果
Leetcode測試結果:Accepted

八、今日學習心得
今天的Top K Frequent Elements是一題結合Hash Table與Heap的題目。和前一天的Kth Largest Element相比,這次不只是找出第k大的數字,而是需要先統計每個元素出現的頻率,再找出頻率最高的k個元素。

一開始看到題目時,我可能會想到先統計每個數字,再全部排序,最後取出前k個。不過學習Heap之後,可以發現其實不需要把所有元素完整排序,只需要維持一個大小為k的Min Heap,就可以持續保留目前頻率最高的元素。

這次也讓我更了解不同資料結構可以互相配合。Hash Table很適合處理「出現幾次」這種需要快速查找與更新的問題,而Heap則適合處理「Top K」這類需要持續維持前幾名的問題。

透過Java和Python分別實作後,我也發現兩種語言雖然使用的工具不同,但整體演算法非常接近。Java使用HashMap和PriorityQueue,Python則使用dict和heapq。

今天最大的收穫是了解到,解題時不一定要只依靠一種資料結構。有時候把不同工具分工合作,反而可以讓問題變得更加清楚,也能提升程式的效率。


上一篇
Day 26|Kth Largest Element:Java 與 Python 實作 Heap
下一篇
Day 28|Longest Substring Without Repeating Characters:Java 與 Python 實作 Sliding Window
系列文
30天 LeetCode 演算法實戰:Java 與 Python 解法比較 共 28 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言