我如何使用哈希表在leetcode中解决“两个和”问题?

问题描述 投票:0回答:2
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");
}

此代码正确运行。这两个版本的代码有什么区别?

public int [] twoSum(int [] nums,int目标){Map map = new HashMap <>(); for(int i = 0; i

在插入之前,您首先必须检查补码是否存在。

示例:

[[2, 0, 2]并将目标设为4。

在第一种情况下,当您到达索引2时,地图将具有{2=0, 0=1}。当您看到最后一个元素时,首先要插入到地图中。现在地图变成

{2=2, 0=1}

补码的索引现在是等于

当前索引(2),因此失败。

但是,在第二个代码段中,您会发现存在一个补码(在索引0处。)>

第一个代码无法处理目标由两个相等的元素组成的测试用例。考虑这个测试案例:

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

第二个代码是正确的。虽然第一个不是:

当处理最后一个element(2)时,首先将地图中现有的<2,1>项替换为[2,2>并用map.put(nums[i], i);替换,然后if子句将成为fasle(map.get(complement )将等于i,即2),这将使代码引发Exception。


为了避免某些测试案例中的代码失败,在编码之前,我们应该首先考虑不同的测试案例,这称为TDD(测试驱动开发)。练习更多将为您提供一些有关如何计算所有可能的测试用例的想法。

java hashtable semantics
2个回答
0
投票

在插入之前,您首先必须检查补码是否存在。


0
投票

第一个代码无法处理目标由两个相等的元素组成的测试用例。考虑这个测试案例:

© www.soinside.com 2019 - 2024. All rights reserved.