#454. 四数相加II
题目
给定四个数组nums1,nums2,nums3,nums4,求使得nums1[i] + nums2[j] + nums3[k] + nums4[l] = 0的 (i,j,k,l)的对数。
例:nums1 = [1, 2] nums2 = [-2, -1] nums3 = [-1, 2] nums4 = [0, 2]
(0, 0, 0, 1) --> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 0
(1, 1, 0, 0) --> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 0
return 2
解答
-
设置一个hashmap = defaultdict() (当被问到,给所有未出现的key附上default值)
-
对于nums1, nums2, 用hashmap记录所有nums1 + nums2 :次数对。
-
循环数组c,d的每一个pair,如果 -(c + d) 出现在hashmap里,返回hashmap[-(c+d)]对应的次数。
- 这样保证一个c, d pair可以配对给多个a,b pair,即当前 c + d 特定值生成零的组合数量。
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
hashmap = defaultdict(int)
count = 0
for a in nums1:
for b in nums2:
hashmap[a + b] += 1
for c in nums3:
for d in nums4:
if -(c + d) in hashmap:
count += hashmap[-(c + d)]
return count
收获
- 四数之和为零,等价于任意两对俩元素的和 – 互为相反数。
- 循环每一组c,d保证了每一组的更新都是唯一的。