iT邦幫忙

2026 iThome 鐵人賽

DAY 1
0
自我挑戰組

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

Day 01|Two Sum:Java 與 Python 實作 Hash Table

  • 分享至 

  • xImage
  •  

一、今日學習目標
今天開始第一天的Leetcode演算法實作,主要學習Hash Table(雜湊表)的基本概念,以及如何利用Hash Table降低搜尋資料所需要的時間。

二、題目介紹
Leetcode 1 : Two Sum
給定一個整數陣列nums和一個目標值target,請從陣列中找出相加等於目標值的兩個數字,並回傳它們的索引值(Indices)。假設每組輸入只會有正好一種有效解答,且同一個位置的元素不能重複使用。

範例輸入:nums=[2, 7, 11, 15], target=9
範例輸出:[0, 1] (因為nums[0]+nums[1]==9)

三、解題思路

本題可以先使用兩層迴圈尋找所有可能的組合,但這種方式時間複雜度高達O(n²),需要較多的運算時間。

因此本題使用Hash Table記錄已經看過的數值與其對應的索引。當處理目前元素nums[i]時,計算出所需要的另一個目標數值complement=target-nums[i]。接著快速檢查Hash Table中是否存在這個complement

  1. 若已存在:代表找到了符合條件的組合,直接回傳對應的索引。
  2. 若不存在:將當前的數值與索引存入Hash Table中,繼續處理下一個數字。

四、Java實作
https://ithelp.ithome.com.tw/upload/images/20260902/20178669up8O5Kkmki.png

https://ithelp.ithome.com.tw/upload/images/20260902/20178669Ar4whUOtQL.png

五、Python實作
https://ithelp.ithome.com.tw/upload/images/20260902/20178669Gu7ApNxyJI.png

https://ithelp.ithome.com.tw/upload/images/20260902/20178669wUG0DJNIDE.png

六、時間與空間複雜度

Java:

  • Time Complexity:O(n)

    只需走訪一次長度為n的陣列,HashMap.containsKey()HashMap.get()的平均查詢時間皆為O(1),因此整體時間複雜度為O(n)。

  • Space Complexity:O(n)

    最壞情況下,需要將走訪過的元素及其索引儲存於HashMap中,因此額外空間複雜度為O(n)。

Python:

  • Time Complexity:O(n)

    只需走訪一次陣列,Python Dictionary的in查詢與索引存取平均時間皆為O(1),因此整體時間複雜度為 O(n)。

  • Space Complexity:O(n)

    最壞情況下,需要將走訪過的元素及其索引儲存在Dictionary中,因此額外空間複雜度為O(n)。

七、Java 與 Python 解法比較

  1. 資料結構使用:

    • Java使用HashMap<K, V>儲存數值與索引,主要透過.put().containsKey().get()等方法進行資料操作。
    • Python使用內建的Dictionary{}實作Hash Table,透過d[key] = value儲存資料,以及in關鍵字進行查詢,程式碼相對簡潔。
  2. 型別與語法差異:

    • Java屬於靜態型別語言,使用HashMap<Integer, Integer>時,需要使用Integer包裝類別來儲存int數值,並可能涉及Autoboxing(自動裝箱)。
    • Python屬於動態型別語言,不需要事先宣告Dictionary中Key與Value的型別,因此程式碼較為精簡。
  3. 實作方式:

    • Java的程式碼通常需要較明確地宣告資料型別與資料結構。
    • Python提供較簡潔的語法,例如可以使用enumerate()同時取得元素的索引與數值,使程式碼更容易閱讀。

八、實作結果

LeetCode 測試結果:Accepted。

九、今日學習心得

今天學習到Hash Table可以有效提升元素查詢的效率。原本使用兩層迴圈的暴力解法需要O(n^2)的時間複雜度,而使用Hash Table後,可以將平均查詢時間降低至O(1),使整體時間複雜度降低為O(n)。

這次實作也讓我了解到「以空間換取時間(Trade-off between Time and Space)」的概念。雖然使用Hash Table需要額外的記憶體空間,但可以大幅減少搜尋所需要的時間。透過Java與Python分別實作,也讓我更加了解兩種程式語言在資料結構使用方式及語法上的差異。

這次實作讓我體會到,在解決演算法問題時,不只是要讓程式得到正確答案,也需要思考如何選擇適合的資料結構,進一步提升程式的效率。


系列文
30天 LeetCode 演算法實戰:Java 與 Python 解法比較1
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言