一、题目介绍
对于这道题,我的第一反应是两次循环的遍历,于是有了下面的代码:
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
但是,这样的运行效率比较低


我翻到了前面,我们来看看这位同学7.63 MB 的代码示例:
import itertools
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i,j in itertools.permutations(range(len(nums)), 2):
if nums[i] + nums[j] == target:
return [i, j]
这位老哥使用了itertools库
itertools.permutations(list,num)可以对list进行全排列,如:
样例1:
for i in itertools.permutations([1, 2, 3], 2):
print(i, end=" ")
结果:

样例2:
for i in itertools.permutations([1, 2, 3,0], 2):
print(i)
结果:

这样确实内存运用的更少。
再来看运行时间靠前的代码:
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
map_sum = dict()
for i in range(len(nums)):
temp = target - nums[i]
if temp in map_sum:
return [map_sum[temp], i]
map_sum[nums[i]] = i
这个代码只用了12ms,这哥们用的字典,巧妙的利用了字典contains操作的时间复杂度为O(1)。
附上官方文档,关于python各种数据类型的时间复杂度操作:
https://wiki.python.org/moin/TimeComplexity
文章讨论了一种常见的编程问题——twoSum,对比了使用双重循环、itertools.permutations以及字典查找三种方法的优劣。双重循环效率低,全排列减少内存但未优化时间复杂度,而字典查找以O(1)的时间复杂度实现了高效解决方案。
1060





