leetcode題目152
輸入 [2,3,-2,4] 返回 6
輸入 [-2,0,-1] 返回 0
題目分析: 動態規劃中等難度的題目,最大乘積具有後無效性
由於乘法具有負負得正的特性,所以需要記錄當前最大與當前最小值,這樣可以確保遇到負數的時候及時翻轉結果。
記陣列為a,最大乘積為imax,上乙個最大乘積為premax, 上乙個最小乘積為premin, 狀態轉移方程
i ma
x[i]
=max
(pre
max∗
a[i]
,pre
min∗
a[i]
,a[i
])
imax[i]=max(premax*a[i], premin*a[i], a[i])
imax[i
]=ma
x(pr
emax
∗a[i
],pr
emin
∗a[i
],a[
i])對應的**是
package main
import "fmt"
func max(x, y int) int else
}func main()
//var a = int
// imax=max(a[i], premax*a[i], premin*a[i])
premax, premin, imax := a[0], a[0], a[0]
for i := 1; i < len(a); i++
premax = max(a[i]*premax, a[i])
premin = max(a[i]*premin, a[i])
imax = max(premax, premin)
} fmt.println(imax)
}
最大乘積子陣列
程式設計之美 上有一道關於在長度為n的陣列中找到n 1個元素乘積最大的題目,不過這並不是本文要討論的。本文討論的是另一種情況,給定乙個長度為n的浮點陣列,找乙個長度任意的子陣列 子陣列的元素在原陣列中是連續存放的 這個子陣列的乘積最大。通常,找乙個滿足指定條件子陣列都會使用動態規劃。遞迴縮小問題規模...
子陣列最大乘積
給定乙個double型別的陣列arr,其中的元素可正可負可0,返回子陣列累乘的最大乘積。例如arr 2.5,4,0,3,0.5,8,1 子陣列 3,0.5,8 累乘可以獲得最大的乘積12,所以返回12。解析 此題可以運用動態規劃解決 設f i 表示以i為結尾的最大值,g i 表示以i結尾的最小值,那...
子陣列最大乘積
給定乙個double型別的陣列arr,其中的元素可正可負可0,返回子陣列累乘的最大乘積。例如arr 2.5,4,0,3,0.5,8,1 子陣列 3,0.5,8 累乘可以獲得最大的乘積12,所以返回12。分析 設f i 表示以i為結尾的最大值,g i 表示以i結尾的最小值,那麼 f i 1 的最大值與...