# 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