Maximum Product Subarray

最大乘积子序列

思想:动态规划+最大最小数组

         状态方程:考虑到负数,所以加上一个min。

         max[i] = Max(max[i-1]*nums[i],min[i-1]*nums[i],nums[i]);

         min[i]  = Min(max[i-1]*nums[i],min[i-1]*nums[i],nums[i]);

         注意:max[i]是指包含当前nums[i]在内的最大乘积,并不一定是前i个数的最大乘积。同理min[i]。

         所以最大乘积应该是max数组中的最大值,而不是max[size-1]。

class Solution {
public:
    int Max(int a,int b,int c)
    {
        if(a>=b&&a>=c)
           return a;
        else if(b>=a&&b>=c)
           return b;
        else
           return c;
    }
    int Min(int a,int b,int c)
    {
        if(a<=b&&a<=c)
           return a;
        else if(b<=a&&b<=c)
           return b;
        else
           return c;
    }
    int maxProduct(vector<int>& nums) {
        int size = nums.size();
        int* max = new int[size];
        int* min = new int[size];
        max[0] = nums[0];
        min[0] = nums[0];
        for(int i=1;i<size;i++)
        {
            int mx = Max(max[i-1]*nums[i],min[i-1]*nums[i],nums[i]);
            int mi = Min(max[i-1]*nums[i],min[i-1]*nums[i],nums[i]);
            max[i]=mx;
            min[i]=mi;
        }
        int max_value=max[0];
        for(int i=0;i<size;i++)
        {
            if(max[i]>max_value)
                max_value = max[i];
        }
        return max_value;
    }
};

 

posted @ 2015-06-25 10:33  醉剑客  阅读(141)  评论(0编辑  收藏  举报