LeetCode | Maximum Product Subarray

我上网查找资料的时候,看到一个东西,喜欢去查内个东西,然后发现和自己一开始的路越来越远,不过没关系,都是知识,而且无心插柳看到的知识面更广,好吧,然后昨天遇到了leetcode,其实早先看到过这个词,但是没去注册然后刷题目,昨天注册了,刷了题目,第一题如下:

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.

这个和最大子数组之和的最大值很像,可是昨天晚上做了两三个钟头都没做出来,想了想,自己算法根基不太好吧,还一边听歌,看电影。。。太影响效率了,今天早上再战,当然是先看了《编程之美》。有了明确的思路,写起来就是快,代码如下:

class Solution {
public:
    int maxProduct(int A[], int n) {
        int start1[n]; //记录以A[i]开头的最大连续正整数乘积
        int start2[n]; <span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;">//记录以A[i]开头的最小连续负整数乘积</span>
        int All[n];    //记录A[i]-A[n-1]之间的最大乘积
        start1[n-1] = A[n-1];
        start2[n-1] = A[n-1];
        All[n-1] = A[n-1];
        for(int i=n-2; i>=0; i--)
        {
            start1[i] = max(A[i],A[i]*start1[i+1],A[i]*start2[i+1]);
            start2[i] = min(A[i],A[i]*start1[i+1],A[i]*start2[i+1]);
            All[i] = start1[i] > All[i+1] ? start1[i] : All[i+1];
            
        }
        return All[0];
    }

    int max(int a,int b,int c){
        int max = a;
        if(max<b) max = b;
        if(max<c) max = c;
        return max;
    }
    
    int min(int a,int b,int c){
        int min = a;
        if(min>b) min = b;
        if(min>c) min = c;
        return min;
    }
};
经典的动态规划写的,和子数组和不同的是,最大数可能是负数乘以负数变成的,所以最大和最小数都要记录下来。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值