📅  最后修改于: 2023-12-03 14:54:35.948000             🧑  作者: Mango
在数组中找到一个长度为 3 的递增子序列,使得这个子序列的乘积最大。
我们用两个数组 dp1
和 dp2
分别记录以 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