LeetCode 解题报告 Maximum Product Subarray

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.

分析:

题目是求连续子数组的最大乘积。

用动态规划来做‘

在做连续子数组的最大和的时候我们是要记录此时的最大值,然后如果为负数就更新成此时数组的下标,不然就要累加进去

int sum = a[0];
    int max = sum;
    for(int i=1;i<n;i++)
    {
        if(sum<=0)
            sum=a[i];
        else
            sum += a[i];

        if(max <= sum)
            max = sum;
    }
    return max;
可是如果是相乘的话就不能这么做了,因为有可能一个负数乘以一个负数之后就变成了一个整数,这样就不能保证谁是最大值了。

这样再思考的话,就可以大概能想出思路了,当遇到一个正数,那么肯定一个正数的最大值相乘是最大的,如果遇到一个负数那么负数的最小值相乘就是最大的了,所以我们可以保留两个值,一个最大值,一个最小值,最后取一个最大的,就是要求的答案

int maxProduct(int A[], int n)
{
    int min_A=A[0];
    int max_A=A[0];
    int temp = A[0];
    int result = max_A;
    for(int i=1;i<n;i++)
    {
        temp=min_A*A[i];
        min_A = min(A[i],min(temp,max_A*A[i]));
        max_A = max(A[i],max(temp,max_A*A[i]));
        result = max(result,max_A);
    }
    return result;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值