返回

运用 Python 掌握 LeetCode 454. 4Sum II:挑战自如,征服算法巅峰

后端

LeetCode 454. 4Sum II:巧用字典,四元组求和高效解法

简介

LeetCode 454. 4Sum II 是一道考察算法能力的经典题型,考验我们高效计算给定数组中四元组和等于目标值的数量。虽然看似简单,但直接采用暴力解法会导致时间复杂度过高,无法在规定时间内完成任务。因此,灵活运用数据结构和算法优化策略至关重要。

巧用字典优化算法

本题的关键优化在于利用字典来巧妙提升效率。具体步骤如下:

  1. 将数组中的所有数字作为键值对存储在字典中,同时记录其出现的次数。
  2. 对于每个数字,使用两个指针遍历数组的剩余部分。
  3. 计算当前数字与指针指向的两个数字之和,并将其与目标值进行比较。
  4. 如果和等于目标值,则将答案加一。
  5. 重复步骤 2 和 3,直到遍历完整个数组。

通过这种方法,我们可以将时间复杂度从 O(n^4) 优化到 O(n^2),大大提高了算法的效率。

Python 代码实现

def fourSumCount(nums1, nums2, nums3, nums4):
    # 将数组中的数字存储在字典中,并记录出现的次数
    dict1 = {}
    for num in nums1:
        if num not in dict1:
            dict1[num] = 0
        dict1[num] += 1
    dict2 = {}
    for num in nums2:
        if num not in dict2:
            dict2[num] = 0
        dict2[num] += 1
    dict3 = {}
    for num in nums3:
        if num not in dict3:
            dict3[num] = 0
        dict3[num] += 1
    dict4 = {}
    for num in nums4:
        if num not in dict4:
            dict4[num] = 0
        dict4[num] += 1

    # 计算四元组的和等于目标值的数量
    count = 0
    for num1 in dict1:
        for num2 in dict2:
            for num3 in dict3:
                for num4 in dict4:
                    if num1 + num2 + num3 + num4 == 0:
                        count += dict1[num1] * dict2[num2] * dict3[num3] * dict4[num4]

    return count

算法分析

使用字典优化后的算法时间复杂度为 O(n^2),其中 n 为数组的长度。这是因为我们需要遍历数组中的所有数字,并使用字典来存储和检索数字。

常见问题解答

  1. 如何判断四元组的和是否等于目标值?
    答案:使用 if 语句比较和与目标值。

  2. 为什么使用字典可以提高效率?
    答案:字典可以快速查找和存储数字,从而避免了在数组中重复遍历的开销。

  3. 算法的复杂度是多少?
    答案:O(n^2),其中 n 为数组的长度。

  4. 如何改进算法的效率?
    答案:除了使用字典外,还可以使用排序和剪枝等技术进一步优化。

  5. 该算法适用于其他类似问题吗?
    答案:是的,该算法可以适用于其他要求计算多元素和等于目标值的问题。