标签:
给出一数组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