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

 

posted @ 2021-02-05 21:32  qilibin  阅读(95)  评论(0编辑  收藏  举报