子数组最大乘积
子数组最大乘积
http://www.nowcoder.com/questionTerminal/9c158345c867466293fc413cff570356
此题求最大值,可以将动态规划数组的第 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 } }