📅  最后修改于: 2023-12-03 15:28:36.347000             🧑  作者: Mango
本题是 门| GATE 2017 MOCK II
的第 51
题。题目要求我们实现一个函数,该函数可以找出数组中两个不同的元素,它们的和等于给定的 target
值,并返回它们在数组中的下标。如果找不到这样的两个元素,则返回 null
。
该题考查的是数组的遍历和查找操作,最直观的思路是使用两重循环,在数组中查找两个元素,判断它们的和是否等于目标值 target
。但是时间复杂度为 O(n^2),不是最优解。
我们可以优化时间复杂度,使用哈希表。哈希表可以在 O(1) 的时间内查找元素,我们可以建立一个哈希表,将元素的值作为键,将元素的下标作为值,然后遍历数组,对于每个元素,查找哈希表中是否存在一个元素的值等于目标值减去当前元素的值,如果存在,就返回这两个元素的下标。如果遍历完整个数组仍然没有找到这样的两个元素,就返回 null
。
def two_sum(nums, target):
"""
在数组中找出两个不同的元素,它们的和等于给定的 target 值,并返回它们在数组中的下标。
如果找不到这样的两个元素,则返回 null。
"""
# 建立一个哈希表
lookup = {}
# 遍历数组
for i in range(len(nums)):
# 在哈希表中查找是否存在一个元素的值等于目标值减去当前元素的值
if target - nums[i] in lookup:
# 如果存在,就返回这两个元素的下标
return [lookup[target - nums[i]], i]
# 将元素的值作为键,将元素的下标作为值,存入哈希表
lookup[nums[i]] = i
# 如果遍历完整个数组仍然没有找到这样的两个元素,就返回 null
return None
下面是一些测试样例:
assert two_sum([2, 7, 11, 15], 9) == [0, 1]
assert two_sum([3, 2, 4], 6) == [1, 2]
assert two_sum([3, 3], 6) == [0, 1]
assert two_sum([1, 2, 3, 4, 5], 10) == [3, 4]
assert two_sum([1, 2, 3, 4, 5], 6) == [1, 3]
assert two_sum([1, 2, 3, 4, 5], 7) == [1, 4]
assert two_sum([1, 2, 3, 4, 5], 8) == [2, 4]
assert two_sum([1, 2, 3, 4, 5], 9) == None