我试图解决:
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/