最大子数组乘积算法

给出一数组a,求最大子数组乘积

算法思路:用动态垃规划.用maxValue(n)表示从0到n的最大子数组乘积,minValue(n)表示从0到n的最小子数组乘积。

状态转移方程为:

minValue(n)= min{minValue(n-1)*a[n], maxValue(n-1)*a[n], a[n]}

maxValue(n)=max{minValue(n-1)*a[n], maxValue(n-1)*a[n], a[n]}

在求取最大子数组乘积时,更新最大值结果。

代码如下:

class Solution
{
public:
    int maxProduct(vector& nums)
    {
        int minValue = 1, maxValue = 1, result = numeric_limits::min();
        int len = nums.size();

        for (int i = 0; i < len; i++)
        {
            int tempMin = min(maxValue * nums[i], min(minValue * nums[i], nums[i]));
            int tempMax = max(maxValue * nums[i], max(minValue * nums[i], nums[i]));

            minValue = tempMin;
            maxValue = tempMax;

            result = max(result, maxValue);
        }

        return result;
    }
};
以数组[2,3,-2,4]为例,输出结果为6

验证代码为:

#include 
#include 
#include 
#include 

using namespace std;

int main()
{
    int a[4] = {2, 3, -2, 4};
    vector nums(a, a + 4);

    Solution solver;
    int res = solver.maxProduct(nums);
    cout << res << endl;

    return 0;
}



你可能感兴趣的:(算法笔记)