> 原题:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
方法一:
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)
for i in range(n):
for j in range(i+1,n):
if nums[i] == target - nums[j]:
return x,y
break
else:
continue
因为现在了leetcode的测试例子变多了,从19增加到20,所以这种最基本的方法是超时的,不能通过运行。
方法2:
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)
for i in range(n):
temp = target - nums[i]
if temp in nums :
j = nums.index(temp)
if j!= i:
return i,j
对于方法一主要问题在于多个循环花费了很多时间,所以一个for循环,再用target减去取到的值,得到temp值,在nums中查找是否是想要的结果,是的话num.index(temp)找到位置,输出结果。
方法三
以上两种方法都不是最好的的方法
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)
d = {}
for i in range(n):
temp = target - nums[i]
if nums[i] in d :
return d[nums[i]],i
else:
d[temp] = i
先创建一个空字典,然后依次把target-nums[x]的值存入字典,d[temp] = i,将value为i,key是temp的字典输入到d中,存入一个就跟nums[i+1]去比较, 例如有一个nums = [2,7,11,15],在i = 0时,temp = 9-2=7,d为空,所以条件语句不成立,执行d[7] = 0,即d = {‘7’:0} ,i= i+1 = 1,nums[1] = 7 条件语句成立,所以返回产生字典7的index,也就是7的value=0,而另一个是1,输出结果。说白了,就一句话,将循环产生的差值放入字典中,为什么是字典因为可以取index,输出的时候用。
方法四
由方法三可以看出字典法的简洁,自然就较为容易想到同样是字典法的方法四
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)
dic1 = {nums[i]: i for i in range(n)}
dic2 = {i:target-nums[i] for i in range(n)}
for i in range(n):
j = dic1.get(dic2.get(i))
if (j is not None) and (j!=i):
return i,j
由于产生了两个字典,将两个for 循环对叠展开了,所以将n平方级的复杂度转化成了2n级别,但是显然比方法三一个字典的方法耗时长一点。