📅  最后修改于: 2023-12-03 15:11:40.024000             🧑  作者: Mango
在计算机科学中,四元组是指一个由四个元素组成的有序组。给定一个正整数数组和一个目标值,找到数组中四个数的不重复组合,其总和等于目标值。
这道题有两套解法,分别为暴力枚举和哈希表。以下将详细介绍这两套解法的思路和代码实现。
暴力枚举是最基本的解法,其思路就是枚举四个数的不重复组合,判断它们的总和是否等于目标值。该解法的时间复杂度为O(N^4),其中N为数组长度。
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为数组长度。
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套题目的介绍和两种解法的详细讲解。