簡體   English   中英

如何使用哈希表來解決 leetcode 中的“二和”問題?

[英]How can I use a hashtable to do the "two sum" problem in leetcode?

public int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        map.put(nums[i], i);
        int complement = target - nums[i];
        if (map.containsKey(complement) && map.get(complement) != i) {
            return new int[]{i, map.get(complement)};
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}

我正在嘗試使用 Hashtable 方法在 leetcode 中進行“二和”。 但是,當我運行上面的代碼時,它最終會引發異常。 當我將map.put(nums[i], i)放在 for 循環的末尾,並刪除“if”子句中的第二個條件時

public int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement)) {
            return new int[]{i, map.get(complement)};
        }
        map.put(nums[i], i);
    }
    throw new IllegalArgumentException("No two sum solution");
}

此代碼正確運行。 這兩個版本的代碼有什么區別?

您首先必須在插入之前檢查補碼是否存在。

例子:

[2, 0, 2]並讓目標為 4。

在第一種情況下,當您到達索引2 ,地圖將具有{2=0, 0=1} 當您看到最后一個元素時,您首先將其插入到地圖中。 地圖現在變成

{2=2, 0=1}

補碼的索引現在等於當前索引 ( 2 ),因此它失敗了。

但是,在第二個代碼片段中,您會發現存在一個補碼(在索引 0 處)。

第一個代碼無法處理目標由兩個相等的元素組成的測試用例。 考慮這個測試用例:

nums=[1,2,2] target=4.

第二個代碼是正確的。 雖然第一個不是:

在處理最后一個元素(2)時,首先將地圖中現有的 <2,1> 條目替換為 <2,2> 由map.put(nums[i], i); ,那么 if 子句將是 fasle(map.get(complement) will equals to i, which is 2),這使得代碼拋出異常。


為了避免某些測試用例中的代碼失敗,在編碼之前,我們應該首先考慮不同的測試用例,這稱為TDD(Test Driven Development)。 多練習會給你一些關於如何計算所有可能的測試用例的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM