我试图解决:

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:
Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

以下是我的解决方案:
def twoSum(nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """

        hash_table = {}
        k = target

        for i, x in enumerate(nums):
            if x not in hash_table:
                hash_table[x] = i

        for x in nums:
            if k-x in hash_table:
                if hash_table[k-x]!= hash_table[x]:
                    return [hash_table[x], hash_table[k-x]]

现在解决方案不正确,因为它没有通过像[3,3],6这样的测试用例。现在这两个3都作为一个预期的条目存储在散列表中,所以只有一个索引记录在散列表中,我的解决方案不起作用。
所以,我认为解决方法可能不是使用哈希表。但正确的解决办法是:
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);
    }
    for (int i = 0; i < nums.length; 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");
}

现在,这在java中基本上是相同的解决方案,它被称为正确的解决方案。
所以,我的问题是:
如何在Python中更改我的解决方案以使其工作而不使测试用例失败?
Java解决方案有何不同,它的哈希表是否有其他行为?
谢谢你的帮助。

最佳答案

Java解决方案有一个检查来处理两个相等的元素:

if (map.containsKey(complement) && map.get(complement) != i)

此条件的第一部分-map.containsKey(complement)-表示complement中存在数字,而第二部分-Map-表示存储在映射中的map.get(complement) != i)索引与索引不同这意味着如果complement,则输入数组中有两个相同的数字。
我不知道python,但看起来你的代码失败了,因为
if hash_table[k-x]!= hash_table[x]

i时始终返回false您需要将complement == nums[i]与输入数组的当前索引进行比较。
基于第一个Python循环,我假设第二个循环应该如下所示:
    for i, x in enumerate(nums):
        if k-x in hash_table:
            if hash_table[k-x]!= i:
                return [i, hash_table[k-x]]

关于java - 查找数组中两个数字的和是否等于k,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48904661/

10-11 01:33