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
  • 相关阅读:
    C#聊天+五子棋
    分页
    用户自定义控件(.ascx)
    一、Text To Speech
    验证码
    白话学习MVC(三)页面周期二
    二、Speech To Text
    微软云体验营 北京站 ,4月27日免费开营啦!名额有限速速报名!
    Windows 8 页面应用测试(2)
    《Windows 8应用开发权威指南》图书开始在网络上预售
  • 原文地址:https://www.cnblogs.com/cnugis/p/14379826.html
Copyright © 2011-2022 走看看