152. Maximum Product Subarray

LeetCode 力扣

1. Description

Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product.

2. Example

Example 1

Input: [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.

Example 2

Input: [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.

3. Solutions

Queue

n = i_nums.size()
Time complexity: O(n)
Space complexity: O(1)

dpmax[i] means the max product ends at the index i, dpmin[i] means the min product(we hope it is negative) ends at the index i

dpmax[i] = max(dpmax[i-1] * i_nums[i], max(i_nums[i], dpmin[i-1] * i_nums[i]))
dpmin[i] = min(dpmin[i-1] * i_nums[i], min(i_nums[i], dpmax[i-1] * i_nums[i]))
dp[i] = max(dp[i-1], dpmax[i])

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// we hope dpmin[i] is a very small negative number, so abs(dpmin[i]) is very big
// then, the next time we meet a negative number, we could make their product very big
// and also, we could remove its negative sign, and get a big result
class Solution {
public:
    // int maxProduct(vector<int>& nums)
    int maxProduct(const vector<int> &i_nums)
    {
        if(i_nums.empty()) return 0;

        int result = i_nums.front(), maxSubProduct = i_nums.front(), minSubProduct = i_nums.front();
        for (int i = 1; i < i_nums.size(); ++i)
        {
            int previousMaxProduct = maxSubProduct, previousMinProduct = minSubProduct;

            maxSubProduct = max(previousMaxProduct * i_nums[i], max(i_nums[i], previousMinProduct * i_nums[i]));
            minSubProduct = min(previousMinProduct * i_nums[i], min(i_nums[i], previousMaxProduct * i_nums[i]));

            result = max(maxSubProduct, result);
        }
        return result;
    }
};
comments powered by Disqus