LeetCode152—Maximum Product Subarray

本文探讨了如何寻找一个数组中乘积最大的连续子数组问题,并提供了一种使用动态规划的方法来解决这一挑战。通过维护两个动态规划数组分别记录以当前元素结尾的最大和最小乘积,最终找到全局最大乘积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题

原题链接

Find the contiguous subarray within an array (containing at least one number) which has the largest product.

For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.

Subscribe to see which companies asked this question

分析

首先想到的是最大子序列和问题,动归方程如下,dp[i]表示以nums[i]结尾的局部最优:
dp[i]=max(dp[i1]+nums[i],nums[i])(1)

由于乘法不同于加法的性质(加法的效果是累计的),乘法可以出现负负得正的情况,也就是说以nums[i]结尾的局部最优可能是一个很小的负数乘上一个很小的负数得到。

因此,此题需要维护两个局部变量,一个表示局部最大,一个表示局部最小。

代码


class Solution {

public:

    int maxProduct(vector<int>& nums)
    {
            vector<int>dp_min(nums.size());
            vector<int>dp_max(nums.size());
            dp_min[0]=nums[0];
            dp_max[0]=nums[0];
            int global=nums[0];
            for(int i = 1;i<nums.size();i++)
            {
                if(nums[i]>0)
                {
                    dp_max[i]=max(dp_max[i-1]*nums[i],nums[i]);
                    dp_min[i]=min(dp_min[i-1]*nums[i],nums[i]);
                }
                else
                {
                    dp_max[i]=max(dp_min[i-1]*nums[i],nums[i]);
                    dp_min[i]=min(dp_max[i-1]*nums[i],nums[i]);

                }

                global=max(global,dp_max[i]);
            }
            return global;

    }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值