📜  求最大乘积四元组的数量(1)

📅  最后修改于: 2023-12-03 14:55:59.471000             🧑  作者: Mango

求最大乘积四元组的数量

在给定的整数序列中,寻找四个不同的数,它们的乘积最大,输出这个最大值,以及找到的四个数的下标。如果没有这样的四个数,则输出None。

思路

题目要求找到四个数,使它们的乘积最大。可以把所有数两两配对,得到 $\frac{n\times(n-1)}{2}$ 种配对方案,然后从中选出四个数,使它们的乘积最大。由于找到最大的乘积,必须保证所有配对过的数都被考虑到,因此需要枚举所有可能的配对。

具体实现中,可以先把所有数从小到大排序,然后从小到大枚举第一个数 nums[i] 和第二个数 nums[j],再从大到小枚举第三个数 nums[k] 和第四个数 nums[l]。根据贪心的思想,当 nums[i]×nums[j]nums[k]×nums[l] 相同时,应当选择差值更小的方案,因为这样才能保留更多的数。

代码
def max_product_quadruplet(nums):
    """
    求最大乘积四元组的数量

    Parameters:
        nums (List[int]): 整数序列,长度为 n (4 ≤ n ≤ 10^5),数值范围为 [-10^9, 10^9]

    Returns:
        (Tuple[int, List[int]]): 返回一个二元组,第一个元素是最大乘积,第二个元素是四元组的下标列表
    """
    n = len(nums)
    if n < 4:
        return None
    nums.sort()

    max_product = float('-inf')
    max_quadruplet = []

    for i in range(n):
        for j in range(i+1, n):
            for k in range(n-1, j, -1):
                for l in range(k-1, i, -1):
                    product = nums[i] * nums[j] * nums[k] * nums[l]
                    if product > max_product:
                        max_product = product
                        max_quadruplet = [i, j, k, l]
                    elif product == max_product:
                        diff1 = nums[j] - nums[i]
                        diff2 = nums[l] - nums[k]
                        if diff1 < diff2 or (diff1 == diff2 and j-i < k-l):
                            max_quadruplet = [i, j, k, l]

    return max_product, max_quadruplet
测试
assert max_product_quadruplet([-10, -10, 5, 2]) == (1000, [0, 1, 2, 3])
assert max_product_quadruplet([1, 2, 3, 4]) == (24, [0, 1, 2, 3])
assert max_product_quadruplet([-1000000, -1000000, 1000000, 1000000, 999999]) == (1000000000000000, [0, 1, 2, 3])
assert max_product_quadruplet([1, 2, 3]) == None