如果由子问题构造解?假设说我们已经知道nums[:len-1]里面的最大值了
R
e
s
s
u
b
Res_{sub}
Ressub,我们如果计算nums连续乘积的最大值呢?
如果说nums[len]是正的,那很简单,我们只需要返回
R
e
s
s
u
b
∗
n
u
m
s
[
l
e
n
]
Res_{sub}*nums[len]
Ressub∗nums[len]即可。
如果nums[len]是负的呢?我们直接返回
R
e
s
s
u
b
Res_{sub}
Ressub吗?当然不是,如果nums[:len-1]中有负数,那么我们就要计算nums[:len-1]中的最小值。因为负负得正,所有最小值乘以当前这个数字就有可能是正的,也就有可能大于
R
e
s
s
u
b
Res_{sub}
Ressub了。
所有由此看来,我们不仅要维护一个最大结果,还要维护一个最小结果。
R
e
s
i
=
m
a
x
(
n
u
m
s
[
i
]
,
M
a
x
i
−
1
∗
n
u
m
s
[
i
]
,
M
i
n
i
−
1
∗
n
u
m
s
[
i
]
)
Res_i = max(nums[i], Max_{i-1}*nums[i], Min_{i-1} * nums[i])
Resi=max(nums[i],Maxi−1∗nums[i],Mini−1∗nums[i])