码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode -- 最大连续乘积子序列

时间:2015-07-23 11:57:39      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:


问题描述: 给定数组,找出连续乘积最大值的子序列。
例如 0,-1,-3,-2,则最大连续乘积为6= (-3) * (-2)


实现思路
此题与最大连续和的子序列问题类似,也可通过找到递推公式然后用DP来解。
关键在于求公式的过程要考虑到元素可能为负的情况。假设元素都为正数的话,DP公式为:
dp[i] = max(a[i],dp[i-1]*a[i]) ,乘或不乘,取最大的那个
可元素可能为负数,因此可以使用min和max分别存当前最大值和最小值,如果当前元素为负数的话,当前最小值就成了最大值。这样一来,dp公式为:
max = Max(Max(max * a[i], min * a[i]), a[i]) ,先从max * a[i]和min * a[i]找出最大值,在与a[i]进行比较
min = Min(Min(max * a[i], min * a[i]), a[i]) ,同上,只是取的是最小值


最后的max即为所求


public class Solution {
    public int MaxProduct(int[] nums) {
        
       var len = nums.Length;
        if(len == 0)
        {
            return 0;
        }
		
    	var max = nums[0];
		var min = nums[0];
		var result = nums[0];
        for(var i = 1;i < len; i++){
            
			var tmpMax = Math.Max(Math.Max(max * nums[i] , min * nums[i]), nums[i]);
			var tmpMin = Math.Min(Math.Min(max * nums[i] , min * nums[i]), nums[i]);
			
			max = tmpMax;
			min = tmpMin;
			
			result = Math.Max(result , max);
        }
        
        return result;
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

LeetCode -- 最大连续乘积子序列

标签:

原文地址:http://blog.csdn.net/lan_liang/article/details/47019711

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!