代码随想录算法训练营第七天|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,一开始的字典去重计数还是有用的。

posted @ 2024-03-01 00:39  HOJEST  阅读(14)  评论(0)    收藏  举报