1.题目
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4]
,
the contiguous subarray [2,3]
has the largest product = 6
.
2.题目分析
这道题目和之前做过的最大子段和问题很像,因而想到可以用动态规划方法求解,不一样的是,这里求得是乘积,因此要考虑负数和0的情况。
3.解法一
动态规划的方法一直用的不熟,所以在查资料的过程中发现了一种比较简单的方法,用两个变量maxCurrent和minCurrent表示当前一段内的最大连乘积和最小连乘积,这里之所有要保存最小的因为如果下一个值为负数,那么此时最小的显然就是最大的了。每次都和 maxProduct 和 minProduct比较,并更新他们。
#include <iostream> #include <string> #include <vector> #include <utility> #include <limits.h> using namespace std; class Solution{ public: int maxProduct(int a[], int n){ int maxCurrent, minCurrent, maxProduct, minProduct, i; //maxCurrent 存储当前最大乘积的候选序列 //minCurrent 存储当前最小乘积的候选序列 maxCurrent = minCurrent = 1; maxProduct = a[0]; //数组可能为{0}; minProduct = a[0]; for(i = 0; i < n; i++){ maxCurrent *= a[i]; minCurrent *= a[i]; if(maxCurrent > maxProduct) maxProduct = maxCurrent; if(minCurrent > maxProduct) //负数 * 负数 的情况 maxProduct = minCurrent; if(maxCurrent < minProduct) minProduct = maxCurrent; if(minCurrent < minProduct) minProduct = minCurrent; if(maxCurrent < minCurrent) swap(maxCurrent, minCurrent); if(maxCurrent <= 0) maxCurrent = 1; } return maxProduct; } }; int main(int argc, const char *argv[]) { int b[] = {0, 2, 3, -4, -2}; Solution so; cout << so.maxProduct(b, sizeof b/sizeof (int)) << endl; return 0; }
4.解法二
动态规划方法。
#include <iostream> #include <string> #include <vector> #include <utility> using namespace std; class Solution{ public: int maxProduct(int a[], int n){ int *maxCurrent, *minCurrent, i, maxProduct; maxCurrent = new int[n]; //maxCurrent[i] a[0]~a[i]的最大连乘积子数组的值 minCurrent = new int[n]; maxCurrent[0] = minCurrent[0] = maxProduct = a[0]; for(i = 1; i < n; i++){ maxCurrent[i] = max(max(a[i], maxCurrent[i-1] * a[i]), minCurrent[i-1] * a[i]); minCurrent[i] = min(min(a[i], maxCurrent[i-1] * a[i]), minCurrent[i-1] * a[i]); maxProduct = max(maxProduct, maxCurrent[i]); } cout << maxProduct << endl; } }; int main(int argc, const char *argv[]) { int a[] = {0}; Solution so; so.maxProduct(a, sizeof a / sizeof(int)); return 0; }
5.参考资料