题目描述:
给你四个整数数组 nums1
、nums2
、nums3
和 nums4
,数组长度都是 n
,请你计算有多少个元组 (i, j, k, l)
能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
示例 1:
输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2] 输出:2 解释: 两个元组如下: 1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0 2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
示例 2:
输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0] 输出:1
提示:
n == nums1.length
n == nums2.length
n == nums3.length
n == nums4.length
1 <= n <= 200
-228 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 228
LeetCode链接:leetcode454
思路分析:
首先定义一个hashmap,此处是字典类型,它的key放前两个数组中取出的n1和n2的和,value存放n1和n2之和的出现的次数。遍历前两个数组,统计它们所有的和的可能并统计这些和出现的次数,存放到字典的key和value中;
定义一个count变量,用来统计n1+n2+n3+n4=0出现的次数,遍历后两个数组取出n3和n4的和。如果要满足n1+n2+n3+n4=0,那么n3+n4必定和n1+n2互为相反数,所以-(n3+n4)=n1+n2, 定义key=-(n3+n4), 再hashmap中遍历key,叠加key的value,即可得出count的最终结果。
代码分析:
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
# 使用字典存储nums1和nums2中的元素及其和
hashmap = dict()
for n1 in nums1:
for n2 in nums2:
# value记录两数之和出现的次数,key记录两数之和
if n1+n2 in hashmap:
hashmap[n1+n2] += 1
# 如果两数之和第一次出现则value设置为1
else:
hashmap[n1+n2] = 1
# 如果 -(n1 +n2)存在于nums3和nums4, 存入结果
count = 0
for n3 in nums3:
for n4 in nums4:
# 此处的key等价于n1+n2, 因为要求的是n1+n2+n3+n4==0
key = -n3 - n4
# 倒查如果hashmap中存在n3和n4和的相反数,则符合条件,则将这个相反数出现的次数即value叠加起来
if key in hashmap:
count += hashmap[key]
return count