📌  相关文章
📜  给定总和的四元组计数 | 2套(1)

📅  最后修改于: 2023-12-03 15:11:40.024000             🧑  作者: Mango

给定总和的四元组计数 | 2套

在计算机科学中,四元组是指一个由四个元素组成的有序组。给定一个正整数数组和一个目标值,找到数组中四个数的不重复组合,其总和等于目标值。

这道题有两套解法,分别为暴力枚举和哈希表。以下将详细介绍这两套解法的思路和代码实现。

解法一:暴力枚举

暴力枚举是最基本的解法,其思路就是枚举四个数的不重复组合,判断它们的总和是否等于目标值。该解法的时间复杂度为O(N^4),其中N为数组长度。

算法流程
  1. 对数组进行排序,方便去重和优化剪枝。
  2. 四重循环枚举每个数的位置。
  3. 判断这四个数的和是否等于目标值,如果等于则计数器加1。
  4. 如果后面三个数之和已经大于目标值,则跳出第一层循环。
  5. 如果当前枚举的数和上一个数相等,则跳过本次循环,以去重。
代码实现
def fourSumCount(nums, target):
    nums.sort()
    res = 0
    for i in range(len(nums) - 3):
        if i > 0 and nums[i] == nums[i - 1]:
            continue
        for j in range(i + 1, len(nums) - 2):
            if j > i + 1 and nums[j] == nums[j - 1]:
                continue
            for k in range(j + 1, len(nums) - 1):
                if k > j + 1 and nums[k] == nums[k - 1]:
                    continue
                for l in range(k + 1, len(nums)):
                    if l > k + 1 and nums[l] == nums[l - 1]:
                        continue
                    if nums[i] + nums[j] + nums[k] + nums[l] == target:
                        res += 1
                    if nums[i] + nums[j] + nums[k] + nums[l] > target:
                        break
    return res
解法二:哈希表

哈希表是一种常用的数据结构,可以用来快速查找某个元素是否存在。该解法的思路是将数组分为两组,分别计算它们两两组合的和,然后将这些和存入哈希表中。接着再枚举剩下的两个数,判断它们的和的相反数是否在哈希表中出现过。该解法的时间复杂度为O(N^2),其中N为数组长度。

算法流程
  1. 使用两个哈希表来存储前半部分数组和后半部分数组的两两组合和出现的次数,分别命名为AB和CD。
  2. 枚举数组前半部分的每一对数A、B,计算它们的和sum并在AB中增加一。
  3. 枚举数组后半部分的每一对数C、D,计算它们的和sum并在CD中增加一。
  4. 枚举数组中任意两个数A、B、C、D,并计算它们的和sum。
  5. 通过哈希表AB和CD,判断sum的相反数是否在哈希表中出现过,若出现过,则计数器加上其出现次数。
  6. 返回计数器的值即可。
代码实现
def fourSumCount(nums, target):
    n = len(nums)
    AB, CD = {}, {}
    res = 0
    for i in range(n):
        for j in range(n):
            sum_AB = nums[i] + nums[j]
            sum_CD = -(nums[i + n // 2] + nums[j + n // 2])
            if sum_AB in AB:
                AB[sum_AB] += 1
            else:
                AB[sum_AB] = 1
            if sum_CD in CD:
                CD[sum_CD] += 1
            else:
                CD[sum_CD] = 1
    for key in AB:
        if -key in CD:
            res += AB[key] * CD[-key]
    return res
总结

从时间复杂度来看,哈希表解法明显更优。但是在实际应用场景中,还需要根据具体数据规模和数据特点选择合适的算法。

以上就是本文对给定总和的四元组计数 | 2套题目的介绍和两种解法的详细讲解。