代码随想录算法训练营第七天|454. 四数相加 II
这道题优化了两遍
第一遍就是没有进行字典,纯粹进行相加,时间不通过(当然的
第二遍是直接对所有数组都使用字典,相当于去重计数,然后还是四个数组依次对应元素value相乘,时间很久。1s多了。
后面看了解析,还是没有放弃一开始都是用字典去重复的想法,没有使用三次依次相加最后判断了。仿照解答答案中间就进行判断,减少了很多时间,直接291ms了:
class Solution:
def convert_dict(self, nums: List[int]) -> dict:
dict_num = {}
for i in nums:
if i not in dict_num:
dict_num[i] = 1
else:
dict_num[i] += 1
return dict_num
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
dict_num1 = self.convert_dict(nums1)
dict_num2 = self.convert_dict(nums2)
dict_num3 = self.convert_dict(nums3)
dict_num4 = self.convert_dict(nums4)
dict_1_2 = {}
for i in dict_num1:
for j in dict_num2:
if i+j not in dict_1_2:
dict_1_2[i+j] = dict_num1[i] * dict_num2[j]
else:
dict_1_2[i+j] += dict_num1[i] * dict_num2[j]
# dict_1_2_3 = {} # 修改这里,使用字典而不是列表
# for i in dict_1_2:
# for j in dict_num3:
# if i+j not in dict_1_2_3:
# dict_1_2_3[i+j] = dict_1_2[i] * dict_num3[j]
# else:
# dict_1_2_3[i+j] += dict_1_2[i] * dict_num3[j]
count = 0
# for i in dict_1_2_3:
# for j in dict_num4:
# if i + j == 0:
# count += dict_1_2_3[i] * dict_num4[j]
for i in dict_num3:
for j in dict_num4:
if -i-j in dict_1_2:
count += dict_1_2[-i-j] * dict_num3[i] * dict_num4[j]
return count
第三遍没有必要对三个字典相加了,最后判断的时候,不应该傻傻的将所有键值进行相加,因为每次进行判断in,都是需要将整个数组进行一遍判断的,要减少耗时的话,就要减少查阅时间。
而且三数的字典很容易就变成很长的一个字典,查阅就更加耗时。本身字典的使用就是为了减少查阅的时间。
试了一下比解答答案少100多ms,一开始的字典去重计数还是有用的。
浙公网安备 33010602011771号