给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
方法一、两层循环,暴力解法
思路:迭代每一个数,找出所有情况的和,和 target 做对等比较
代码如下:(twoSum_violence)
def twosum_violence(nums, target):
length = len(nums)
for i in range(0, length):
for j in range(0, length):
if i == j:
continue
if (nums[i] + nums[j]) == target:
return [i, j]
return None
方法二、哈希表
思路:先遍历一遍,准备一个哈希表,之后再遍历一遍寻找差值是否在哈希表中
哈希表:哈希的精髓就是,能够快速 确定是否存在某个key 和 获取该 key 的值 而不需要进行耗时的迭代
数学的逆向思维: 不从 “得到和 ——> 与target 进行比较”而是 “得到差——> 确定差是否存在?”
精髓在于 有 “是否存在”,于是 第一遍,生成 map, 第二遍,判断差是否在 map中
代码如下:(twosum_map)
def twosum_map(nums, target):
length = len(nums)
value_index_map = {nums[i]: i for i in range(0, length)}
for num in nums:
diff = target - num
if diff in value_index_map:
i = nums.index(num)
j = value_index_map[diff]
if i != j:
return [i, j]
return None
方法三、哈希表PRO
思路:只进行一遍迭代,边迭代边生成哈希表
假设 迭代顺序是从左往右的,每个迭代的数,只去和记录表中非自身的节点做比较,其实是和自身左边的数做比较。
当我们遍历到某个数时,判断差是否存在哈希表中,虽然哈希表中只有当前数往左的数,但即使正确结果在右边的
某个数,当迭代到右边那个数时,差值也能在map中找到
同样是逆向思维:因为 A + B = target,既然可以通过 target, A 找 B, 那也可以通过,target, B 找到 A
代码如下:(twosum_map_pro)
def towsum_map_pro(nums, target):
length = len(nums)
num_index_map = dict()
for i in range(0, length):
num = nums[i]
diff = target - num
if diff in num_index_map:
return i, num_index_map[diff]
num_index_map[num] = i
return None