码迷,mamicode.com
首页 > 编程语言 > 详细

最大子数组乘积算法

时间:2015-09-05 12:33:45      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:

给出一数组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;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

最大子数组乘积算法

标签:

原文地址:http://blog.csdn.net/xiexingshishu/article/details/48223941

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!