此题求最大值,可以将动态规划数组的第 i 个数字表示为加入第 i 个位置数字后的最大值。但由于此题存在负数乘法,可能最小值变为最大值,所以需要将最大值与最小值为 amax,amin 都存储(按照原始动态规划应该存储在 dp 数组中,但由于更新只与上一状态有关,可以直接存储数字,更新即可,这样可节约内存),然后比较 maxdp[i-1]*arr[i],mindp[i-1]*arr[i],arr[i] 之间的最大值与最小值,并更新 amax,amin。将每个状态的 amax 的最大值作为结果返回。
注:此思想可用于有负数的子数组最大和或差
func maxProduct( arr []float64 ) float64 {
// write code here
// if len(arr) == 1{
// return arr[0]
// }
amin,amax,res := arr[0],arr[0],arr[0]
for i:=1;i<len(arr);i++{
amax,amin = max(max(amin*arr[i],amax*arr[i]),arr[i]),min(min(arr[i]*amin,arr[i]*amax),arr[i])
res = max(amax,res)
}
return res
}
func max(i,j float64)float64{
if i>j{
return i
}else{
return j
}
}
func min(i,j float64)float64{
if i > j{
return j
}else{
return i
}
} 
京公网安备 11010502036488号