python-leetcode-1995. 统计特殊四元组

1995. 统计特殊四元组 - 力扣(LeetCode)

这个题目是一个四元组计数问题,要求找出所有满足 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³),可以通过大部分测试。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值