152.乘积最大子序列

1 篇文章 0 订阅
本文介绍如何解决寻找给定整数数组中乘积最大子序列的问题。通过分析,提出暴力递归和动态规划两种方法。动态规划方案中,定义了两个维度的状态DP[i][0]和DP[i][1]分别表示到第i个元素为止的最大正数乘积和最大负数乘积,根据数组元素正负调整状态转移方程,最终取DP[i][0]中的最大值作为答案。
摘要由CSDN通过智能技术生成

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

分析

如果要求不连续,把所有大于 0 的数字拿出来乘积
但是这里需要连续的

方法

1.暴力求解 递归
2.DP

DP 状态定义:DP[i] 从最开始下表为0的位置一直到i元素位置的product subarray的最大值
![
还要求DP[n-1],DP[n-2]…DP[0]

状态转移方程:DP[i+1]=DP[i] *a[i+1]
a[i+1]为正数则正确,a[i+1]为负值的时候则会出现负值

所以 a[i+1]为正数 maxDP[i]
a[i+1]为负数数 minDP[i]
所以在DP定义的时候需要两维度 另加一维度区分最大0最小1

新的状态转移方程为:

正的最大值DP[i,0]=
		 if a[i]>=0:
			DP[i-1,0]*a[i]
		 else:
			DP[i-1,1]*a[i]
负的最大值DP[i,1]=
		if a[i]>=0:
			DP[i-1,1]*a[i]
		else:
			DP[i-1,0]*a[i]

最后的值在DP[i,0] 求其中的max

代码实现

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        if nums is None:return 0
        
        dp = [[0 for _ in range(2)] for _ in range(2)]
        
        dp[0][1],dp[0][0],res = nums[0],nums[0],nums[0]
        
        for i in range(1,len(nums)):
            x,y = i % 2,(i-1) % 2 #滚动数组节省空间
            dp[x][0] = max(dp[y][0]*nums[i],dp[y][1]*nums[i],nums[i])
            dp[x][1] = min(dp[y][0]*nums[i],dp[y][1]*nums[i],nums[i])
            res = max(res,dp[x][0])
        
    	return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值