Leetcode Maximun Product Subarray 相关算法实现,使用dp算法完成问题,并提供测试,提供两种实现,一种为常规的,别一种为最大子串积的快速解决方法,代码如下。
常规解法:O(n^2)
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int maxProduct(vector<int>& nums) {
int len = nums.size();
vector<vector<vector<int> > > re(len, vector<vector<int> >(len, vector<int>(2, 0)));
re.resize(len);
for (int i = 0; i < len; i ++) {
re[i][i][0] = nums[i];
re[i][i][1] = nums[i];
}
for (int i = 1; i < len; i ++) {
for (int j = 0; j < len - i; j ++ ) {
int max = re[j][j][0];
for (int k = 0; k < i; k ++) {
int temp = re[j][j + k][1] * re[j + k + 1][j + i][1];
max = maxOfFour(max, temp, re[j][j + k][0], \
re[j + k + 1][j + i][0]);
}
re[j][j + i][0] = max;
re[j][j + i][1] = re[j][j][1] * re[j + 1][j + i][1];
}
}
return re[0][len - 1][0];
}
int maxOfFour(int a, int b, int c, int d) {
int max = a;
if (b > max) {
max = b;
}
if (c > max) {
max = c;
}
if (d > max) {
max = d;
}
return max;
}
};
int main() {
vector<int> a;
a.push_back(-1);
a.push_back(2);
a.push_back(0);
a.push_back(-4);
a.push_back(3);
a.push_back(-2);
Solution so;
int re = so.maxProduct(a);
cout<<"The result is :"<<re<<endl;
return 0;
}
由本问题特性实现的算法:O(n)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
int maxProduct(vector<int>& nums) {
int len = nums.size();
int reMax = nums[0];
int reMin = nums[0];
int re = nums[0];
for (int i = 1; i < len; i ++) {
int temp = reMax;
reMax = max(max(nums[i], reMin * nums[i]), reMax * nums[i]);
reMin = min(min(nums[i], reMin * nums[i]), temp * nums[i]);
re = max(reMax, re);
}
return re;
}
};
int main() {
vector<int> a;
a.push_back(-1);
a.push_back(0);
a.push_back(3);
a.push_back(-4);
Solution so;
int re = so.maxProduct(a);
cout<<"The result is :"<<re<<endl;
return 0;
}