1014------算法筆記----------Maximum Product Subarray 最大乘積子數組

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

https://oj.leetcode.com/problems/maximum-product-subarray/

http://blog.csdn.net/v_july_v/article/details/8701148

相關文章
相關標籤/搜索