美文网首页Leetcode
Leetcode.153.Maximum Product Sub

Leetcode.153.Maximum Product Sub

作者: Jimmy木 | 来源:发表于2019-11-08 11:39 被阅读0次

题目

给定一个数组, 求连续子数组的最大乘积.

Input: [2,3,-2,4]
Output: 6
Input: [-2,0,-1]
Output: 0

思路1

循环
时间复杂度O(n)²

int maxProduct(vector<int>& nums) {
    if (nums.empty()) return 0;
    int res = nums[0];
    for (int i = 0; i < nums.size(); i++) {
        int temp = nums[i];
        res = max(res, temp);
        for (int j = i+1;j < nums.size();j++) {
            temp *= nums[j];
            if (temp > res) {
                res = temp;
            }
        }
        res = max(res, temp);
    }
    return res;
}

思路2

DP. 记录出前i个数的最大乘积和最小乘积,当第i个数为负可能就需要使用最小乘积.
时间复杂度O(n)

int maxProduct3(vector<int>& nums) {
    if (nums.empty()) return 0;
    int n = (int)nums.size();

    vector<int> maxP(n, 0), minP(n, 0);
    maxP[0] = nums[0];
    minP[0] = nums[0];
    int maxProduct = nums[0];

    for(int i = 1; i < n; i++){
        maxP[i] = max(nums[i], max(maxP[i-1] * nums[i], minP[i-1] * nums[i]));
        minP[i] = min(nums[i], min(minP[i-1] * nums[i], maxP[i-1] * nums[i]));
        maxProduct = max(maxProduct, maxP[i]);
    }

    return maxProduct;
 }

总结

这种题一般都是使用双指针或者DP.
DP可以使用二维数组记录,但是二维过于复杂, 可以使用两个数组来简化问题.

相关文章

网友评论

    本文标题:Leetcode.153.Maximum Product Sub

    本文链接:https://www.haomeiwen.com/subject/imuibctx.html