四数之和II
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
- 在对map使用判断 if num in map时,判断的是num是否在map.keys()中,而不是map.values()中
- 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),所以一般遇到这类问题,平分的情况下,时间复杂度是最低的。