

这个题目是一个四元组计数问题,要求找出所有满足 nums[a] + nums[b] + nums[c] == nums[d] 且 a < b < c < d 的四元组数目。
由于暴力枚举所有四元组的时间复杂度是 O(n^4),在数组长度较大时效率会非常低。我们可以用一些优化思路来加速。
解法思路
思路1:暴力解法(适用于小数据)
直接四重循环:
def count_quadruplets(nums):
n = len(nums)
count = 0
for a in range(n):
for b in range(a + 1, n):
for c in range(b + 1, n):
for d in range(c + 1, n):
if nums[a] + nums[b] + nums[c] == nums[d]:
count += 1
return count
该方法适用于 n <= 50 左右。
思路2:优化的三重循环 + 哈希表
我们可以固定 d,倒序枚举,并提前把后面的数放入哈希表,减少一次循环:
def count_quadruplets(nums):
n = len(nums)
count = 0
from collections import defaultdict
for d in range(3, n):
# 预处理:统计所有可能的 nums[d] - nums[c](d 固定,c 遍历 d 之前的一个位置)
diff_map = defaultdict(int)
for c in range(d - 1, 1, -1):
for b in range(c - 1, 0, -1):
for a in range(b - 1, -1, -1):
if nums[a] + nums[b] + nums[c] == nums[d]:
count += 1
return count
这个版本仍然是 O(n^4),但更容易转为优化形式。
思路3:最终优化版(O(n^3))
我们可以从后往前枚举 d,然后在每次 c 确定后,提前记录所有 nums[d] - nums[c] 的值,再在前面找 nums[a] + nums[b] 是否能匹配:
def count_quadruplets(nums):
n = len(nums)
count = 0
for c in range(n - 2, 1, -1):
freq = {}
for d in range(c + 1, n):
val = nums[d] - nums[c]
freq[val] = freq.get(val, 0) + 1
for a in range(c):
for b in range(a + 1, c):
s = nums[a] + nums[b]
if s in freq:
count += freq[s]
return count
这个是 最优解法,时间复杂度为 O(n³),可以通过大部分测试。
506

被折叠的 条评论
为什么被折叠?



