题目描述:
给定四个包含整数的数组 nums1
, nums2
, nums3
, nums4
,计算有多少个元组 (i, j, k, l)
使得 nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
。
示例:
输入:
nums1 = [1, 2]
nums2 = [-2, -1]
nums3 = [-1, 2]
nums4 = [0, 2]
输出: 2
解释: 两个元组如下:
- (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
- (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
解题思路:
这道题可以使用哈希表来优化求解过程。具体步骤如下:
-
构建哈希表:
- 创建一个哈希表
sum_map
,用于存储nums1
和nums2
中所有可能的两数之和及其出现的次数。
- 创建一个哈希表
-
填充哈希表:
- 遍历
nums1
和nums2
,计算每一对数的和sum
,并将该和及其出现的次数存储在sum_map
中。
- 遍历
-
查找匹配的元组:
- 遍历
nums3
和nums4
,计算每一对数的和的相反数-sum
。 - 在
sum_map
中查找是否存在该相反数,如果存在,则将其出现的次数累加到结果中。
- 遍历
代码实现:
def fourSumCount(nums1, nums2, nums3, nums4):
sum_map = {}
result = 0
# 构建哈希表,存储 nums1 和 nums2 的所有两数之和及其出现的次数
for num1 in nums1:
for num2 in nums2:
sum_ = num1 + num2
if sum_ in sum_map:
sum_map[sum_] += 1
else:
sum_map[sum_] = 1
# 遍历 nums3 和 nums4,查找匹配的元组
for num3 in nums3:
for num4 in nums4:
target = -(num3 + num4)
if target in sum_map:
result += sum_map[target]
return result
示例
nums1 = [1, 2] nums2 = [-2, -1] nums3 = [-1, 2] nums4 = [0, 2] print(fourSumCount(nums1, nums2, nums3, nums4)) # 输出: 2
复杂度分析:
- 时间复杂度: O(n^2),其中 n 是每个数组的长度。我们需要遍历
nums1
和nums2
来构建哈希表,再遍历nums3
和nums4
来查找匹配的元组。 - 空间复杂度: O(n^2),哈希表的大小取决于
nums1
和nums2
中所有可能的两数之和的数量。
总结:
这道题通过巧妙地使用哈希表,将四数之和的问题转化为两数之和的问题,大大减少了计算复杂度。这种方法在处理多数组求和问题时非常有效,值得借鉴。
发表回复