Leetcode_Maximum Product Subarray(c++ version)

62 篇文章 0 订阅

地址:https://oj.leetcode.com/problems/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.

思路:

要特别注意数组里的0,因为0可能会使你的结果功亏一篑。

1. 用0把array分成许多subarray,计算每个subarray的乘积最大值

2. 计算每个subarray中负数的个数,并对负数的个数分类讨论

    a) 负数个数为偶数,直接乘上所有数即是乘积最大值

    b) 负数个数为奇数,

            如果是1个负数,那个这个负数左边的部分和右边的部分两乘积取较大值即可。

    如是多于1个负数,那么最大值应该是max(开始到最后1个负数前一个位置数的乘积, 第一个负数后一个位置到数组末尾乘积)


感觉逻辑这么复杂,应该有更好的解法方法。好久没练,手感欠佳。。。

C++ 参考代码:

class Solution {
private:
    int maxSubProduct(int A[], int n) {
        if(n<=0)
            return n;
        else if(n==1)
            return A[0];
        vector<int>vec;
        for(int i = 0; i<n; ++i)
            if(A[i]<0)
                vec.push_back(i);
        int ans = 1, tag = 0, tmp = 1;
        if(vec.size() & 0x01) { //odd
            if(vec.size()==1) {
                for(int i = 0; i<vec[0]; ++i) {
                    ans *= A[i];
                }
                for(int i = vec[0]+1; i<n; ++i) {
                    tmp *= A[i];
                }
                if(tmp != 1)
                    ans = max(ans, tmp);
            }else {
                for(int i = 0; i<=vec[vec.size()-1]-1; ++i)
                    ans *= A[i];
                for(int i = vec[0]+1; i<n; ++i)
                    tmp *= A[i];
                ans = max(ans, tmp);
            }
        }else { //even
            for(int i = 0; i<n; ++i)
                ans *= A[i];
        }
        return ans;
    }
public:
    int maxProduct(int A[], int n) {
        int begin = 0, ans = A[0];
        int i = 0;
        while(i<=n) {
            if(i==n) {
                ans = max(ans, maxSubProduct(A+begin, i-begin));
                break;
            }
            if(!A[i] && i<n) {
                ans = max(0, max(ans, maxSubProduct(A+begin, i-begin)));
                begin = ++i;
            } else
                ++i;
        }
        return ans;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值