LeetCode -- 最大連續乘積子序列
阿新 • • 發佈:2017-06-04
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即為所求
問題描寫敘述: 給定數組,找出連續乘積最大值的子序列。
比如 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 -- 最大連續乘積子序列