算法_哈希表_四数之和II

本文介绍了LeetCode上的四数之和II问题的解决方案,通过使用Python的unordered_map(字典)统计数组两两之和,降低时间复杂度至O(n^2),从而提高效率。文章详细解析了算法思路,包括如何避免暴力求解,以及为何将四数之和问题拆分为两两求和进行统计。此外,还探讨了算法设计中的时间复杂度优化策略。
摘要由CSDN通过智能技术生成

四数之和II

leetcode链接

1.解法

本题解题步骤:

1.首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
2.遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
3.定义int变量count,用来统计a+b+c+d = 0 出现的次数。
4.在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
5.最后返回统计值 count 就可以了
def fourSumCount(nums1,nums2,nums3,nums4):
    hashmap = collections.defaultdict(int)
    for num1 in nums1:
        for num2 in nums2:
            hashmap[num1+num2] += 1
            
    count = 0 # 用来计数

    for num3 in nums3:
        for num4 in nums4:
            if -num3-num4 in hashmap:
                count += hashmap[-num3-num4]
    return count

2.总结

python

  1. 在对map使用判断 if num in map时,判断的是num是否在map.keys()中,而不是map.values()中
  2. collections.defaultdict():使用这个就不用对num1+num2是否在map中分情况赋值了 ,就可以统一写成hashmap[num1+num2] += 1

算法

四数相加为什么要分成两两求和,然后再统计数量?

因为如果单纯使用暴力的话,时间复杂度为 O ( n 4 ) O(n^4) O(n4);如果分成先统计一个出现的次数,然后计算另外三个的和,再进行比较的话,时间复杂度为 O ( n 3 ) O(n^3) O(n3);如果平分的话,那么时间复杂度就降为 O ( n 2 ) O(n^2) O(n2),所以一般遇到这类问题,平分的情况下,时间复杂度是最低的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值