题目
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
思路
- 暴力破解法——最简单粗暴的方法。对于数组中的每一个元素x,都遍历寻找是否存在目标元素 target-x ,存在,则找到答案。
- 二遍哈希表法——借助哈希表(字典)以空间换时间。两次迭代:第一次将每个元素的值和它的索引添加到表中,第二次检查每个元素的目标元素 target-x 是否存在于表中。注意,目标元素不能是 x 本身!
- 一遍哈希表法——基于上一种方法的优化。在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。
解答
Python3版Solution之暴力破解法
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums)):
for j in range(i+1,len(nums)):
if nums[j] == target - nums[i]:
return [i,j]
Python3版Solution之二遍哈希表法
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
d = {} #key为value value为index
for i, n in enumerate(nums): #i:index n:value
d[n] = i
for i, n in enumerate(nums):
m = target - n
if m in d and d[m] != i:
return [d[m], i]
Python3版Solution之一遍哈希表法
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
d = {} #key为value value为index
#遍历链表,借助字典快速寻找target - n
for i, n in enumerate(nums): #i:index n:value
m = target - n
if m in d:
return [d[m], i]
else:
d[n] = i
参考:Leetcode之两数之和 https://leetcode-cn.com/problems/two-sum/solution/