LintCode:M-乘积最大子序列

来源:互联网 发布:怎样金融网络投资 编辑:程序博客网 时间:2024/06/04 18:52

LintCode:链接


找出一个序列中乘积最大的连续子序列(至少包含一个数)。

样例

比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6


分析

当全部为正数的时候,乘积肯定为最大,但是由于有负数出现,只有偶数情况的负数才能转正

所以前面乘积的负数在未来可能变成最大,所以需要分别记录 i 之前的连续乘积的最大和最小值


public class Solution {    /*     * @param nums: An array of integers     * @return: An integer     */    //最大积、最小积    public int maxProduct(int[] nums) {        int n = nums.length;        int minMul = nums[0];        int maxMul = nums[0];        int max=maxMul;        for(int i=1; i<n; i++){            //maxMul=max(自身,和i前最小积的乘积,和i前最大积的乘积)            int tMaxMul = maxMul;            int tMinMul = minMul;            maxMul = Math.max(nums[i], Math.max(nums[i]*tMinMul, nums[i]*tMaxMul));            minMul = Math.min(nums[i], Math.min(nums[i]*tMinMul, nums[i]*tMaxMul));            max = Math.max(max, maxMul);        }                return max;    }         //暴力,超内存    public int maxProduct_enum(int[] nums) {        int n = nums.length;        //dp[i][j]表示i~j区间的最大乘积        int[][] dp = new int[n][n];        int max=Integer.MIN_VALUE;        for(int len=1; len<=n; len++){            for(int i=0; i+len-1<n; i++){                int j = i+len-1;                //dp[i][j] = nums[j];                if(i==0)                    dp[i][j] = (j==0?1:dp[i][j-1])*nums[j];                else if(i==j){                    dp[i][j] = nums[j];                }else{                    if(nums[i-1]==0){                        dp[i][j]=dp[i][j-1]*nums[j];                    }else{                        dp[i][j]=dp[i-1][j-1]/nums[i-1]*nums[j];                    }                }                                    max = Math.max(max, dp[i][j]);            }        }                return max;    }}


原创粉丝点击