【问题标题】:How can I use a hashtable to do the "two sum" problem in leetcode?如何使用哈希表来解决 leetcode 中的“二和”问题?
【发布时间】:2020-06-13 05:44:09
【问题描述】:
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");
}

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

【问题讨论】:

    标签: java hashtable semantics


    【解决方案1】:

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

    例子:

    [2, 0, 2] 并让目标为 4。

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

    {2=2, 0=1}
    

    补码的索引现在等于当前索引 (2),因此它失败了。

    但是,在第二个代码 sn-p 中,您会发现存在补码(在索引 0 处)。

    【讨论】:

      【解决方案2】:

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

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

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

      在处理最后一个元素(2)时,首先将映射中现有的条目替换为map.put(nums[i], i);的,然后if子句将是fasle(map.get(补) 将等于 i,即 2),这使代码抛出异常。


      为了避免代码在某些测试用例中失败,在编码之前,我们应该首先考虑不同的测试用例,这称为TDD(Test Driven Development)。多练习会给你一些关于如何计算我们所有可能的测试用例的想法。

      【讨论】:

        猜你喜欢
        • 2021-08-30
        • 2021-08-13
        • 1970-01-01
        • 2022-01-01
        • 2020-05-01
        • 2019-08-18
        • 2020-02-16
        • 2019-08-13
        • 2021-10-22
        相关资源
        最近更新 更多