152.M 乘积最大子数组
思路
minDp[i] = min(nums[i], min(minDp[i-1]*nums[i], maxDp[i-1]*nums[i])) //元素本身,或者与前一项的最大或最小值之积的最小值
maxDp[i] = max(nums[i], max(minDp[i-1]*nums[i], maxDp[i-1]*nums[i])) //元素本身,或者与前一项的最大或最小值之积的最大值Code
func maxProduct(nums []int) int {
minDp := make([]int, len(nums))
maxDp := make([]int, len(nums))
minDp[0] = nums[0]
maxDp[0] = nums[0]
ans := maxDp[0]
for i := 1; i < len(nums); i++ {
// 如果nums[i]为负数,最大值来自于minDp[i-1]*nums[i]
minDp[i] = min(nums[i], min(minDp[i-1]*nums[i], maxDp[i-1]*nums[i]))
maxDp[i] = max(nums[i], max(minDp[i-1]*nums[i], maxDp[i-1]*nums[i]))
ans = max(ans, maxDp[i])
}
return ans
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func min(a, b int) int {
if a < b {
return a
}
return b
}Last updated