📅  最后修改于: 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