1. 程式人生 > >LeetCode -- 最大連續乘積子序列

LeetCode -- 最大連續乘積子序列

solution leet 推公式 name class return pre [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 -- 最大連續乘積子序列