📜  找到最大乘积的长度为 3 的递增子序列(1)

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

找到最大乘积的长度为 3 的递增子序列

简介

在数组中找到一个长度为 3 的递增子序列,使得这个子序列的乘积最大。

解题思路

我们用两个数组 dp1dp2 分别记录以 i 结尾的最小和最大升序子序列的值,即:

  • dp1[i]:以 i 结尾的最小升序子序列的值。
  • dp2[i]:以 i 结尾的最大升序子序列的值。

那么对于任何一个位置 i,都可以用 dp1[i]dp2[i] 的值来更新答案。

具体来说,我们对于每个位置 i,更新答案需要找到长度为 2 的递增子序列,然后乘上当前位置的值,再更新答案。我们也可以借鉴最长递增子序列的解法,使用 binary search 来减小时间复杂度。

同时,为了防止出现溢出问题,我们可以用 double 类型来储存答案。

代码实现
def max_product_of_three(nums):
    dp1 = [float('inf')] * len(nums)
    dp2 = [float('-inf')] * len(nums)

    for i in range(len(nums)):
        for j in range(i):
            if nums[i] > nums[j]:
                dp1[i] = min(dp1[i], dp1[j] * nums[i])
                dp2[i] = max(dp2[i], dp2[j] * nums[i])
    
    ans = float('-inf')

    for i in range(len(nums)):
        if dp1[i] != float('inf') and dp2[i] != float('-inf'):
            ans = max(ans, dp2[i])

    return ans
测试样例
assert max_product_of_three([1,2,3]) == 6
assert max_product_of_three([1,2,3,4]) == 24
assert max_product_of_three([-10,-10,5,2]) == 500