在解决leetcode 3sum问题时,我提交了以下代码:
class Solution1:
def threeSum(self, nums: List[int]) -> List[List[int]]:
if len(nums) < 3:
return []
res = set()
nums.sort()
for firstEle in range(len(nums)-2):
if firstEle > 0 and nums[firstEle] == nums[firstEle - 1]:
continue
target = 0 - nums[firstEle]
dic = {}
for j in range(firstEle+ 1,len(nums)):
if target - nums[j] in dic:
res.add((nums[firstEle], target - nums[j], nums[j]))
else:
dic[nums[j]] = j
return list(map(list, res))
的运行时间约为844毫秒。
我将dict
替换为set
,并修改了代码,如下所示:
class Solution2:
def threeSum(self, nums: List[int]) -> List[List[int]]:
if len(nums) < 3:
return []
res = set()
nums.sort()
for firstEle in range(len(nums)-2):
if firstEle > 0 and nums[firstEle] == nums[firstEle - 1]:
continue
target = 0 - nums[firstEle]
mem = set()
for j in range(firstEle+ 1,len(nums)):
if target - nums[j] in mem:
res.add((nums[firstEle], target - nums[j], nums[j]))
else:
mem.add(nums[j])
return list(map(list, res))
那么运行时间约为1044毫秒。
为什么set
数据结构会降低效率?
已更新:
我在笔记本电脑上测试了代码:
import timeit
s1 = Solution1()
s2 = Solution2()
print("dict:", timeit.timeit(lambda: s1.threeSum([-1, 0, 1, 2, -1, -4]), number=100000))
print("set:", timeit.timeit(lambda: s2.threeSum([-1, 0, 1, 2, -1, -4]), number=100000))
并得到输出:
dict: 0.671448961016722
set: 0.7314219229156151
环境:
MacBook Pro(13英寸视网膜,2015年初)
CPU:2.7 GHz Intel Core i5
RAM:8 GB 1867 MHz DDR3
Python版本:3.6
似乎set
仍然更慢。
答案 0 :(得分:0)
检查这些链接:
time-complexity-of-python-set-operations
time-complexity-of-accessing-a-python-dict
集合和dict时间复杂度均为O(1)。