【动态规划】子数组问题 乘积最大子数组

题目连接:https://leetcode.cn/problems/maximum-product-subarray/


 一.题目介绍


二.求乘积类型子数组的分析

        如题目所述求子数组乘积的最大值,因为乘法中负数 * 负数等于正数,所以我们不能确定 i 位置的数是正是负,也不能确定0~i-1 位置中的乘积是正是负,所以单一的状态是无法分析得到结果的,因此我们在分析状态时不仅要记录最大乘积和,也要记录最小乘积和


三.状态分析

         这里最小子数组乘积和g[i]存在的意义就是在 i位置不知道正负的情况下辅助最大子数组乘积和f[i]的更新,这样列出的状态方程才符合题意。


 四.完整代码

int maxProduct(vector<int>& nums) 
    {
        int n = nums.size();
        int res = nums[0]; //这种初始化可以避免nums只有单个元素的条件
        vector<int> f(n), g(n);
        f[0] = g[0] = nums[0];
        for(int i = 1; i < n; i++)
        {
            int x = nums[i];
            int tmp_max = max(x, x * f[i-1]);
            f[i] = max(tmp_max, x * g[i-1]);
            int tmp_min = min(x, x * g[i-1]);
            g[i] = min(tmp_min, x * f[i-1]);

            res = max(res, f[i]);
        }

        return res;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值