乘积最大子序列

题目Alt

思路

本道题要求我们从一个找出乘积最大的连续子序列(该序列至少包含一个数)
首先,必须要满足的条件是连续,那么相比较我们之前做的最大子序列和来说,本题存在的一个难点就是:一个最大的乘积的连续序列乘以一个负数后,就会变成最小的,同样,本来是最小的乘积的连续序列乘以一个负数后,有可能会变成最大的,如果参照最大子序列和一样只设置一个dp数组,dp[i]用来表示包含第i个元素的前i个元素的乘积最大的连续子序列,那么显然不好写出状态转移方程,具体思路如下:

  1. 所以我们还需要再增加一个维度,用来表示前i个元素的乘积最小的连续子序列,那么此时我们便有两个维度,一个是maxdp,表示当前乘积最大的连续子序列(包含第i个元素),一个是mindp,表示当前乘积最小的连续子序列(包含第i个元素)
  2. 对于当前的maxdp[i],有三种情况:(1)maxdp[i]=maxdp[i-1]*nums[i](2)maxdp[i]=nums[i](当maxdp[i-1]和min[i-1]都为负数且nums[i]为正数 或者maxdp[i-1]和mindp[i-1]都为正数且nums[i]为负数)(3)maxdp[i]=nums[i]*min[i-1](nums[i]为负数且maxdp[i-1]为负数),所以状态转移方程为:maxdp[i]=max(maxdp[i-1]*nums[i],nums[i],nums[i]*mindp[i-1])
  3. 同理mindp[i]=min(mindp[i-1]*nums[i],nums[i],maxdp[i-1]*nums[i])
  4. 因为maxdp和mindp都是关于i和i-1之间的关系,所以我们可以使用两个变量Max和Min代替dp数组

相关代码如下:

class Solution {
public:
	int maxProduct(vector<int>& nums) {
        int size = nums.size();
		if (size < 1)
			return 0;
		int res = nums[0];
		int Max = nums[0];
		int Min = nums[0];
		for (int i = 1; i < size; i++) {
			int temp = Max;//因为后面的Max值要更新,所以先保存下来,方便后面计算Min时使用
			Max = max(max(Max * nums[i], nums[i]), Min * nums[i]);
			Min = min(min(temp * nums[i], nums[i]), Min * nums[i]);
			res = max(Max, res);
		}
		return res;
	}
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值