152 Maximum Product Subarray 乘积最大子序列

Posted lina2014

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了152 Maximum Product Subarray 乘积最大子序列相关的知识,希望对你有一定的参考价值。

找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
例如, 给定序列 [2,3,-2,4],
其中乘积最大的子序列为 [2,3] 其乘积为 6。
详见:https://leetcode.com/problems/maximum-product-subarray/description/

Java实现:

方法一:

用两个dp数组,其中f[i]表示子数组[0, i]范围内并且一定包含nums[i]数字的最大子数组乘积,g[i]表示子数组[0, i]范围内并且一定包含nums[i]数字的最小子数组乘积,初始化时f[0]和g[0]都初始化为nums[0],其余都初始化为0。那么从数组的第二个数字开始遍历,那么此时的最大值和最小值只会在f[i-1]*nums[i]、g[i-1]*nums[i]和nums[i]这三个数字之间产生。所以我们用三者中的最大值来更新f[i],用最小值来更新g[i],然后用f[i]来更新结果res即可,由于最终的结果不一定会包括nums[n-1]这个数字,所以f[n-1]不一定是最终解,不断更新的结果res才是。

class Solution {
    public int maxProduct(int[] nums) {
        int n=nums.length;
        int res=nums[0];
        int[] f=new int[n];
        int[] g=new int[n];
        f[0]=nums[0];
        g[0]=nums[0];
        for(int i=1;i<n;++i){
            f[i]=Math.max(Math.max(f[i-1]*nums[i],g[i-1]*nums[i]),nums[i]);
            g[i]=Math.min(Math.min(g[i-1]*nums[i],f[i-1]*nums[i]),nums[i]);
            res=Math.max(res,f[i]);
        }
        return res;
    }
}

方法二:

class Solution {
    public int maxProduct(int[] nums) {
        int n=nums.length;
        int res=nums[0];
        int mn=nums[0];
        int mx=nums[0];
        for(int i=1;i<n;++i){
            int tmax=mx,tmin=mn;
            mx=Math.max(Math.max(tmax*nums[i],tmin*nums[i]),nums[i]);
            mn=Math.min(Math.min(tmax*nums[i],tmin*nums[i]),nums[i]);
            res=Math.max(res,mx);
        }
        return res;
    }
}

参考:https://www.cnblogs.com/grandyang/p/4028713.html

以上是关于152 Maximum Product Subarray 乘积最大子序列的主要内容,如果未能解决你的问题,请参考以下文章

152. Maximum Product Subarray(js)

152. Maximum Product Subarray

leetcode 152. Maximum Product Subarray

刷题152. Maximum Product Subarray

LeetCode 152. Maximum Product Subarray

152. Maximum Product Subarray