zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    11月20号
    11月17号
    11月21号
    11月19号
    第一章 Windows下前端代码打包编译
    每日日报
    每日日报
    每日日报
    学习Java的第十三天
    学习Java的第十六天——随机数
  • 原文地址:https://www.cnblogs.com/cnugis/p/14379826.html
Copyright © 2011-2022 走看看