一、今日學習目標
今天開始第一天的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:
四、Java實作

五、Python實作

六、時間與空間複雜度
Time Complexity:O(n)
只需走訪一次長度為n的陣列,HashMap.containsKey()與HashMap.get()的平均查詢時間皆為O(1),因此整體時間複雜度為O(n)。
Space Complexity:O(n)
最壞情況下,需要將走訪過的元素及其索引儲存於HashMap中,因此額外空間複雜度為O(n)。
Time Complexity:O(n)
只需走訪一次陣列,Python Dictionary的in查詢與索引存取平均時間皆為O(1),因此整體時間複雜度為 O(n)。
Space Complexity:O(n)
最壞情況下,需要將走訪過的元素及其索引儲存在Dictionary中,因此額外空間複雜度為O(n)。
七、Java 與 Python 解法比較
資料結構使用:
HashMap<K, V>儲存數值與索引,主要透過.put()、.containsKey()與.get()等方法進行資料操作。{}實作Hash Table,透過d[key] = value儲存資料,以及in關鍵字進行查詢,程式碼相對簡潔。型別與語法差異:
HashMap<Integer, Integer>時,需要使用Integer包裝類別來儲存int數值,並可能涉及Autoboxing(自動裝箱)。實作方式:
enumerate()同時取得元素的索引與數值,使程式碼更容易閱讀。八、實作結果
LeetCode 測試結果:Accepted。
九、今日學習心得
今天學習到Hash Table可以有效提升元素查詢的效率。原本使用兩層迴圈的暴力解法需要O(n^2)的時間複雜度,而使用Hash Table後,可以將平均查詢時間降低至O(1),使整體時間複雜度降低為O(n)。
這次實作也讓我了解到「以空間換取時間(Trade-off between Time and Space)」的概念。雖然使用Hash Table需要額外的記憶體空間,但可以大幅減少搜尋所需要的時間。透過Java與Python分別實作,也讓我更加了解兩種程式語言在資料結構使用方式及語法上的差異。
這次實作讓我體會到,在解決演算法問題時,不只是要讓程式得到正確答案,也需要思考如何選擇適合的資料結構,進一步提升程式的效率。