[leetCode 第2题] -- Maximum Product Subarray

简介: 题目链接题目意思: 给定一个数组,求最大连续子序列的乘积分析: 简单dp。maxDp[i]表示以num[i]结尾的最大子序列乘积,minDp[i]类似         maxDp[i] = max{num[i], maxDp[i-1]*num[i], minDp[i-1]*num[i]}         minDp[i] = min{num[i], minDp[i-1]*num[i], maxDp[i-1]*num[i]}         之所以要minDp,是因为有负数的存在,导致多了一个状态。


题目链接

题目意思: 给定一个数组,求最大连续子序列的乘积

分析: 简单dp。maxDp[i]表示以num[i]结尾的最大子序列乘积,minDp[i]类似

         maxDp[i] = max{num[i], maxDp[i-1]*num[i], minDp[i-1]*num[i]}

         minDp[i] = min{num[i], minDp[i-1]*num[i], maxDp[i-1]*num[i]}

         之所以要minDp,是因为有负数的存在,导致多了一个状态。


代码: 

class Solution {
public:
    int maxProduct(int A[], int n);
};

int Solution::maxProduct(int A[], int n) {
    int* minDp = new int[n];
    int* maxDp = new int[n];
    minDp[0] = maxDp[0] = A[0];
    int res = maxDp[0];
    for(int i = 1; i < n; i++){
        minDp[i] = min(min(minDp[i-1]*A[i], A[i]), maxDp[i-1]*A[i]);
        maxDp[i] = max(max(maxDp[i-1]*A[i], A[i]), minDp[i-1]*A[i]);
        res = max(res, maxDp[i]);
    }
    delete minDp;
    delete maxDp;
    minDp = maxDp = NULL;
    return res;
}

目录
相关文章
|
6月前
Leetcode 53.Maximum Subarray
题意简单,给出一个数组,求出其中最大的子数组和。 这种简单题目背后蕴藏着很巧妙的解题方法。其实只需要遍历一次数组就可以求得解。 思路是这样的,你想想看,如果一段子数组的和是负数, 那么这一段子数组不可能是最大和数组的一部分,丢掉重新从下一个位置开始选。
28 0
LeetCode 104. 二叉树的最大深度 Maximum Depth of Binary Tree
LeetCode 104. 二叉树的最大深度 Maximum Depth of Binary Tree
|
算法
LeetCode 414. Third Maximum Number
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
67 0
LeetCode 414. Third Maximum Number
LeetCode 318. Maximum Product of Word Lengths
给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。
53 0
LeetCode 318. Maximum Product of Word Lengths
LeetCode 239. Sliding Window Maximum
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。 返回滑动窗口最大值。
43 0
LeetCode 239. Sliding Window Maximum
LeetCode 209. Minimum Size Subarray Sum
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
88 0
LeetCode 209. Minimum Size Subarray Sum
LeetCode 164. Maximum Gap
给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。 如果数组元素个数小于 2,则返回 0。
56 0
LeetCode 164. Maximum Gap
LeetCode 152. Maximum Product Subarray
给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
31 0
LeetCode 152. Maximum Product Subarray
LeetCode 104. Maximum Depth of Binary Tree
给定一颗二叉树,返回其最大深度. 注意:深度从1开始计数.
47 0
LeetCode 104. Maximum Depth of Binary Tree
LeetCode 53. Maximum Subarray
给定整数数组nums,找到具有最大总和的子数组(数组要求连续)并且返回数组的和,给定的数组包含至少一个数字。
33 0