最大子数组乘积算法

来源:互联网 发布:九浅一深网络剧百度云 编辑:程序博客网 时间:2024/06/09 17:05

给出一数组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<int>& nums)    {        int minValue = 1, maxValue = 1, result = numeric_limits<int>::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 <iostream>#include <algorithm>#include <vector>#include <limits>using namespace std;int main(){    int a[4] = {2, 3, -2, 4};    vector<int> nums(a, a + 4);    Solution solver;    int res = solver.maxProduct(nums);    cout << res << endl;    return 0;}



0 0