152. 乘积最大子数组

image.png

暴力

  1. func maxProduct1(nums []int) int {
  2. max :=math.MinInt64
  3. for i:=0;i<len(nums);i++{
  4. var res =1
  5. for j:=i;j<len(nums);j++{
  6. res =res*nums[j]
  7. if max<res{
  8. max =res
  9. }
  10. }
  11. }
  12. return max
  13. }

图片.png

动态规划

需要实现了动态转移 一个是当前最大值 一个是最小值 ,因为数组存在负数 ,当两个负数相乘为整数

  1. package main
  2. import (
  3. "fmt"
  4. "sort"
  5. )
  6. // 三个数字排列 获取最大值和最小值
  7. func search(a,b,c int)(big,small int){
  8. i :=[]int{a,b,c}
  9. sort.Ints(i)
  10. return i[2],i[0]
  11. }
  12. func maxProduct(nums []int) int {
  13. dpMax :=make([]int,len(nums))
  14. dpMin:= make([]int,len(nums))
  15. dpMax[0] =nums[0]
  16. dpMin[0] = nums[0]
  17. max :=nums[0]
  18. for i:=1;i<len(nums);i++{
  19. dpMax[i],dpMin[i] = search(dpMax[i-1]*nums[i],dpMin[i-1]*nums[i],nums[i])
  20. if dpMax[i]>max {
  21. max = dpMax[i]
  22. }
  23. }
  24. return max
  25. }
  26. func main() {
  27. fmt.Println(maxProduct([]int{-2,0,-1}))
  28. fmt.Println(maxProduct([]int{2,3,-2,4}))
  29. fmt.Println(maxProduct([]int{-2,3,-4}))
  30. }

image.png