【数组】3:四数相加Ⅱ

Leetcode 454: 四数相加Ⅱ (python)

注:本人文章中内容中来自于各大佬的经验总结,仅供自身复习及学习,并无商业用途,若有时忘记标注作者及出处还请提醒,敬请见谅。

我的思路

额,本小菜鸡最直接的思路是采用最简单的四层for循环,但是尝试后发现,这种方法在输入数组较大时会超出时间限制。
于是我尝试将四个数组分成两组,采用一个字典记录前两个数组中每一种数值组合出现的次数,如{1:3, 2:4},这个字典说明前两个数组中,使得两数之和为1的组合有3种,使得两数之和为2的组合有4种。
然后再对后两个数组的数值和进行判断,看其和的负数是否存在于之前创建的字典的键中,若存在,则说明这种情况能够使得四个数的和为0,且这种情况的个数为字典中对应键的个数,如:在前面假设的情况下,第三个和第四个数组中有一对数之和为-2,那么这时使得四个数之和为0的组合共有4种。最后将字典中所有符合情况的键对应的值相加,即得最后结果。

我的leetcode代码如下:

class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        n = len(nums1)
        res = 0
        dic = {}

        for i in range(n):
            for j in range(n):
                if nums1[i] + nums2[j] in dic.keys():
                    dic[nums1[i] + nums2[j]] += 1
                else:
                    dic[nums1[i] + nums2[j]] = 1
            
        for i in range(n):
            for j in range(n):
                if -(nums3[i] + nums4[j]) in dic.keys():
                    res += dic[-(nums3[i] + nums4[j])]

        return res

        

leetcode官方题解

后面我查看题解时,觉得官方代码比我的好看多了,特此记录学习一下:

leetcode官方题解代码:

class Solution:
    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

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/4sum-ii/solution/si-shu-xiang-jia-ii-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值