Descripition:
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].
解法一:暴力破解(Accepted)
最容易想到的就是这个,两层循环,将所有的两两组合都加一下,然后看看是否等于 target,这里直接贴代码了,时间复杂度为
O(n2)
O
(
n
2
)
。
# Approach #1 (Brute Force) [Accepted]
class Solution(object):
def twoSum(self, nums, target):
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if(nums[i] + nums[j] == target):
return (i, j)
解法二:借用 Map(Accepted)
这个方法需要借助一个 Map 来实现,可以只扫描两次或者一次数组就能实现需求。由于此题的条件已经说明,每个 input 只有一个解,这就证明数组中每个数都不相同。因此比较容易想的是扫描两次数组:首先扫描一遍数组,将数组中的索引和索引对应的数值分别作为 value 和 key 放入一个 Map 中。然后再扫描一遍数组,对数组的每一项
num[i]
n
u
m
[
i
]
检查 Map 中是否存在 key 为
target−num[i]
t
a
r
g
e
t
−
n
u
m
[
i
]
的项,如果存在,就证明这两项就是满足要求的项,即返回
num[i]
n
u
m
[
i
]
和
target−num[i]
t
a
r
g
e
t
−
n
u
m
[
i
]
对应的 value 即可,如果不存在则继续遍历。但是由于加法是对称的,2 + 7 和 7 + 2 其实是一样的,所以我们可以将两次扫描合并成一次,在对数组的每一项
num[i]
n
u
m
[
i
]
检查 Map 中是否存在 key 为
target−num[i]
t
a
r
g
e
t
−
n
u
m
[
i
]
的项,如果存在,则返回,不存在直接将该项存入 Map 即可,拿题目中给的例子来说,虽然在遍历 2 的时候没有返回,但是由于将 2 放入了 Map,在遍历 7 的时候一定会返回。
# Approach #2 (One-pass Hash Table) [Accepted]
class Solution(object):
def twoSum(self, nums, target):
dictMap = {}
for index, value in enumerate(nums):
if target - value in dictMap:
return dictMap[target - value], index
dictMap[value] = index
在其他语言中 Map 数据结构(比如 Java 中 Map 的一个子类 HashMap)在 Python 中的实现是 dict,由于说 Map 大家比较熟悉,因此在以后的博客中,我就全部说 Map 了。