LeetCode454四数相加
# coding:utf-8 """ Name : LeetCode454.py Author : qlb Contect : 17801044486@163.com Time : 2021/2/5 17:21 Desc: 四数相加 """ import collections from typing import List # 解题思路 # 1 一共分为两组 一组哈希表用来提前存储 (key)和值 以及 (value)和值出现的次数 另一组用来计算 # 2 这样的分为三种情况 # 哈希表存A 计算 BCD三个数组之和 时间复杂度为 O(n) + O(n^3) # 哈希表存A+B和值 计算 CD两个数组之和 时间复杂度为 O(n^2) + O(n^2) # 哈希表存A+B+C和值 计算 D 时间复杂度为 O(n^3) + O(n) # 3 所以综上所述 采用第二种情况 # 4 以保存AB两数组之和 计算CD两数组为例 采用双层循环将 A + B存入到一个哈希表中 键为A+B之和 值为这个和出现的次数 # 5 计算C+D 遍历 -(C+D)的值是否出现在哈希表的key中 如果出现 此时的value累加起来就是满足条件的元祖个数 class Solution: def fourSumCount(self, A: List[int], B: List[int], C: List[int], D: List[int]) -> int: dicAB = {} for a in A: for b in B: key = a + b if key in dicAB: dicAB[key] += 1 else: dicAB[key] = 1 count = 0 for c in C: for d in D: value = c + d if -value in dicAB: count += dicAB[-value] return count class Solution2: def fourSumCount(self, A: List[int], B: List[int], C: List[int], D: List[int]) -> int: countAB = collections.Counter(u + v for u in A for v in B) ans = 0 for u in C: for v in D: if -u - v in countAB: ans += countAB[-u - v] return ans