4Sum II,LeetCode,454

题目描述:

给定四个包含整数的数组 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

解释: 两个元组如下:

  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

解题思路:

这道题可以使用哈希表来优化求解过程。具体步骤如下:

  1. 构建哈希表:
    • 创建一个哈希表 sum_map,用于存储 nums1nums2 中所有可能的两数之和及其出现的次数。
  2. 填充哈希表:
    • 遍历 nums1nums2,计算每一对数的和 sum,并将该和及其出现的次数存储在 sum_map 中。
  3. 查找匹配的元组:
    • 遍历 nums3nums4,计算每一对数的和的相反数 -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 是每个数组的长度。我们需要遍历 nums1nums2 来构建哈希表,再遍历 nums3nums4 来查找匹配的元组。
  • 空间复杂度: O(n^2),哈希表的大小取决于 nums1nums2 中所有可能的两数之和的数量。

总结:

这道题通过巧妙地使用哈希表,将四数之和的问题转化为两数之和的问题,大大减少了计算复杂度。这种方法在处理多数组求和问题时非常有效,值得借鉴。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注