LintCode-乘积最大子序列

Posted

tags:

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

题目描述:

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

样例:

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

 

第一种解法,同最大和子序列的暴力求解法,直接求出每个子序列的乘积,取最大值。

 1 public class Solution {
 2     /**
 3      * @param nums: an array of integers
 4      * @return: an integer
 5      */
 6     public int maxProduct(int[] nums) {
 7        
 8        int max = nums[0];
 9        int index = 1;
10        
11        while(index <= nums.length){
12            
13            for(int i=0;i<=nums.length-index;i++){
14                int product = 1;
15                for(int j=0;j<index;j++){
16                    product *= nums[i+j];
17                }
18                
19                if(product > max)
20                     max = product;
21            }
22            index ++;
23        }
24        return max;
25     }
26 }

同样,在数据量大的时候回超时,通过94%测试点。

 

第二种解法:

动态规划,每一步只需要记住其前一步的整数最大值和负数的最小值。代码如下:

 1 public class Solution {
 2     /**
 3      * @param nums: an array of integers
 4      * @return: an integer
 5      */
 6     public int maxProduct(int[] nums) {
 7        int posmax=nums[0],negmax=nums[0],max=nums[0];
 8        
 9        for(int i=1;i<nums.length;i++){
10            int tempPosMax = posmax;
11            int tempNegMax = negmax;
12            posmax = Math.max(nums[i],Math.max(nums[i]*tempPosMax,nums[i]*tempNegMax));
13            negmax = Math.min(nums[i],Math.min(nums[i]*tempPosMax,nums[i]*tempNegMax));
14            if(Math.max(posmax,negmax) > max){
15                max = Math.max(posmax,negmax);
16            }
17        }
18        
19        return max;
20        
21     }
22 }

 

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

题目地址(152. 乘积最大子数组)

152乘积最大子序列

[LeetCode]152. 乘积最大子序列(DP)

编程之法:面试和算法心得(最大连续乘积子串)

152. 乘积最大子数组-动态规划

LintCode Python 简单级题目 最小子数组和最大子数组和