1.題目ios
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
.spa
2.題目分析.net
這道題目和以前作過的最大子段和問題很像,於是想到能夠用動態規劃方法求解,不同的是,這裏求得是乘積,所以要考慮負數和0的狀況。code
3.解法一blog
動態規劃的方法一直用的不熟,因此在查資料的過程當中發現了一種比較簡單的方法,用兩個變量maxCurrent和minCurrent表示當前一段內的最大連乘積和最小連乘積,這裏之全部要保存最小的由於若是下一個值爲負數,那麼此時最小的顯然就是最大的了。每次都和 maxProduct 和 minProduct比較,並更新他們。leetcode
#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.解法二get
動態規劃方法。string
#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.參考資料it