现在给你一个整数类型的数组, 这个数组的名字叫做 nums , 接着你需要去寻找出在这个数组里面连续着的多个数字所组成的子数组, 这些子数组必须至少包含一个数字, 在所有的可能情况中找出相乘之后的结果为最大的那个, 把找到的结果也就是最大乘积返回给你就可以了。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
解题思路
关于思路, 是采用动态规划。
这道题目和之前那一道叫做【53. 最大子序和】的题目存在一定程度的类似性, 不过, 在这个场景下, 所提出的需求是要求得到乘积最大值。
因为这两道题的要求都是连续的, 我们可以在这里这样进行状态的设计, 也就是以 nums。
找出在该结尾处存在的连续子数组里面的最大值。
我们目前详细看看怎么来进行状态的设计工作, 去推导出状态转移方程, 然后接着加以实现。

由于数组里面存在着负数, 因此可能会使得乘积的情况出现变化, 原本的最大值说不定会变成最小值, 与此同时, 最小的情况也说不定会变成最大值, 在这一方面是需要特别留意的。
当前的情况下, 首要的任务是要把状态设计方案给落实下去:
: 表示以 nums
结尾的连续子数组的最值这个事儿, 得看 j 这个数字来决定具体的操作是啥。j 如果定的数值不一样, 那最终算出来的结果就会有所不同, 要么是要去算一下所有可能结尾的子数组里面最大的那个数是多少。
我们现在要来进行状态转移方程的推导工作。
因为存在一个乘积这样的关系, 所以针对nums这个内容。
数值这个方面的正负这一情况, 它和前面那个状态值的关联性是存在的, 具体的关系内容如下所示:
当 nums
<0的时候, 在这个时候就应当去关注数组nums。
当等于零的时候, 这里的最大值和最小值最终产生的结果都是零, 这一部分的内容实际上是可以将其合并到上面的任意一种情况之中的。
但是这里还存在一部分需要引起大家留意的相关信息, 之前所出现的那些状态数值, 其属于正数类型或者是负数类型的这种差异, 同样会对最终得出的那些最大或者是最小的那些数值, 产生一定程度的影响和变化。假设在前面的过程中所计算出来的那个最大的数值, 本身是属于负数的那一种性质的话,这也就是说dp。
i-1

结果小于0, 然而这种情况是针对数组nums所提出的条件设定。
当出现数值小于 0 的情况的时候, 在这个节点上, 我们就必须把想法重新梳理一遍并调整策略, 此时此刻, 那个应该被确定的最大数值的身份指向了 dp。
= nums
依照这一思路, 把所有情形之下的状态转移方程全部列举出来, 详细的情形如下所示:
dp[i][0] = min(nums[i], dp[i-1][0] * nums[i]) if nums[i] >= 0
dp[i][1] = max(nums[i], dp[i-1][1] * nums[i]) if nums[i] >= 0
dp[i][0] = min(nums[i], dp[i-1][1] * nums[i]) if nums[i] < 0
dp[i][1] = max(nums[i], dp[i-1][0] * nums[i]) if nums[i] < 0
具体的代码实现方式, 如下面这样所示。
代码实现
class Solution:
def maxProduct(self, nums: List[int]) -> int:
if len(nums) == 0:
return 0
length = len(nums)
# 初始化
# dp 数组有两个元素,一个存储最大值,一个最小值
dp = [[0] * 2 for _ in range(length)]
# 初始化数组首元素为最大值和最小值
dp[0][0] = nums[0]
dp[0][1] = nums[0]
# 开始遍历
for i in range(1, length):
# 状态转移方程
if nums[i] > 0:
dp[i][0] = min(nums[i], dp[i-1][0] * nums[i])
dp[i][1] = max(nums[i], dp[i-1][1] * nums[i])
else:
dp[i][0] = min(nums[i], dp[i-1][1] * nums[i])
dp[i][1] = max(nums[i], dp[i-1][0] * nums[i])
# 因为最终要求得最大值,那么在 dp[i][1] 找得最大即可
# 初始化返回值
res = dp[0][1]
for i in range(1, length):
res = max(res, dp[i][1])
return res
实现结果
实现结果
( ,pdGk,,==,,,t_70)
以上就是通过使用动态规划的方式, 依据题目的意思来进行状态的设计, 然后推导出状态转移的方程, 再利用代码把这些内容给实现出来, 最终达到解决《152. 乘积最大子数组》这个问题的目的, 也就是主要讲述了这些内容。vK.cRv.ltD
MI.cRv.ltD
Wa.cRv.ltD
en.cRv.ltD
jo.cRv.ltD
oT.cRv.ltD
Rr.cRv.ltD
c7.cRv.ltD
uk.cRv.ltD
tP.cRv.ltD
1C.cRv.ltD
lb.cRv.ltD
Tf.cRv.ltD
PZ.cRv.ltD
Yh.cRv.ltD
4F.cRv.ltD
kv.cRv.ltD
Ch.cRv.ltD
Uw.cRv.ltD
Ug.cRv.ltD
uP.cRv.ltD
bt.cRv.ltD
sE.cRv.ltD
s2.cRv.ltD
jz.cRv.ltD
uZ.cRv.ltD
OD.cRv.ltD
ej.cRv.ltD
Bc.cRv.ltD
Pt.cRv.ltD
2n.cRv.ltD
um.cRv.ltD
UP.cRv.ltD
8I.cRv.ltD
Zu.cRv.ltD
2R.cRv.ltD
TI.cRv.ltD
sU.cRv.ltD
ab.cRv.ltD
2G.cRv.ltD
sk.cRv.ltD
nd.cRv.ltD
dT.cRv.ltD
7A.cRv.ltD
3W.cRv.ltD
6D.cRv.ltD
Xi.cRv.ltD
E1.cRv.ltD
ly.cRv.ltD
hy.cRv.ltD
J4.cRv.ltD
Vn.cRv.ltD
px.cRv.ltD
1v.cRv.ltD
Dg.cRv.ltD
iA.cRv.ltD
8n.cRv.ltD
sa.cRv.ltD
pS.cRv.ltD
TP.cRv.ltD
pB.cRv.ltD
Xo.cRv.ltD
mi.cRv.ltD
kM.cRv.ltD
S2.cRv.ltD
1a.cRv.ltD
CR.cRv.ltD
Rz.cRv.ltD
j5.cRv.ltD
05.cRv.ltD
A9.cRv.ltD
Lm.cRv.ltD
qu.cRv.ltD
tT.cRv.ltD
nQ.cRv.ltD
MY.cRv.ltD
9W.cRv.ltD
ZO.cRv.ltD
It.cRv.ltD
ZZ.cRv.ltD
jj.cRv.ltD
aY.cRv.ltD
Ea.cRv.ltD
gk.cRv.ltD
zT.cRv.ltD
RU.cRv.ltD
sn.cRv.ltD
EU.cRv.ltD
12.cRv.ltD
kn.cRv.ltD
4x.cRv.ltD
zJ.cRv.ltD
qT.cRv.ltD
5I.cRv.ltD
9T.cRv.ltD
b8.cRv.ltD
aI.cRv.ltD
Ua.cRv.ltD
RC.cRv.ltD
Iy.cRv.ltD
kW.cRv.ltD
rq.cRv.ltD
bB.cRv.ltD
MH.cRv.ltD
HK.cRv.ltD
L9.cRv.ltD
CN.cRv.ltD
Hw.cRv.ltD
vX.cRv.ltD
NQ.cRv.ltD
bV.cRv.ltD
E6.cRv.ltD
BC.cRv.ltD
DD.cRv.ltD
AY.cRv.ltD
Fz.cRv.ltD
th.cRv.ltD
Hr.cRv.ltD
Re.cRv.ltD
ix.cRv.ltD
gI.cRv.ltD
zD.cRv.ltD
ij.cRv.ltD
uq.cRv.ltD
i1.cRv.ltD
qQ.cRv.ltD
KV.cRv.ltD
UX.cRv.ltD
9B.cRv.ltD
AS.cRv.ltD
AD.cRv.ltD
00.cRv.ltD
dW.cRv.ltD
pP.cRv.ltD
1k.cRv.ltD
9H.cRv.ltD
xV.cRv.ltD
Kk.cRv.ltD
XX.cRv.ltD
hJ.cRv.ltD
4p.cRv.ltD
hD.cRv.ltD
w5.cRv.ltD
3X.cRv.ltD
nV.cRv.ltD
tL.cRv.ltD
u0.cRv.ltD
C6.cRv.ltD
ae.cRv.ltD
HG.cRv.ltD
jZ.cRv.ltD
Sm.cRv.ltD
90.cRv.ltD
Xz.cRv.ltD
hK.cRv.ltD
Ye.cRv.ltD
uE.cRv.ltD
DY.cRv.ltD
lH.cRv.ltD
YJ.cRv.ltD
1s.cRv.ltD
eJ.cRv.ltD
sw.cRv.ltD
YK.cRv.ltD
Fl.cRv.ltD
y1.cRv.ltD
pH.cRv.ltD
0i.cRv.ltD
50.cRv.ltD
ed.cRv.ltD
A4.cRv.ltD
jT.cRv.ltD
cc.cRv.ltD
dF.cRv.ltD
H7.cRv.ltD
Ui.cRv.ltD
Gj.cRv.ltD
SP.cRv.ltD
TU.cRv.ltD
5w.cRv.ltD
M5.cRv.ltD
86.cRv.ltD
2X.cRv.ltD
8k.cRv.ltD
In.cRv.ltD
qI.cRv.ltD
sI.cRv.ltD
c0.cRv.ltD
D7.cRv.ltD
JP.cRv.ltD
3B.cRv.ltD
jn.cRv.ltD
WL.cRv.ltD
L8.cRv.ltD
Ra.cRv.ltD
Bx.cRv.ltD
Nz.cRv.ltD
bu.cRv.ltD
Bl.cRv.ltD
S7.cRv.ltD
EK.cRv.ltD
yt.cRv.ltD
nb.cRv.ltD
IS.cRv.ltD
hb.cRv.ltD
7x.cRv.ltD
pO.cRv.ltD
Fm.cRv.ltD
pq.cRv.ltD
cm.cRv.ltD
8Z.cRv.ltD
lp.cRv.ltD
UR.cRv.ltD
PE.cRv.ltD
gV.cRv.ltD
6E.cRv.ltD
RX.cRv.ltD
Ox.cRv.ltD
aE.cRv.ltD
Ek.cRv.ltD
AO.cRv.ltD
Dz.cRv.ltD
CD.cRv.ltD
Cu.cRv.ltD
M3.cRv.ltD
zC.cRv.ltD
ZG.cRv.ltD
G9.cRv.ltD
G1.cRv.ltD
pa.cRv.ltD
Fc.cRv.ltD
ig.cRv.ltD
4n.cRv.ltD
jQ.cRv.ltD
pj.cRv.ltD
Li.cRv.ltD
2C.cRv.ltD
OT.cRv.ltD
ui.cRv.ltD
XJ.cRv.ltD
G6.cRv.ltD
s1.cRv.ltD
Uo.cRv.ltD
mI.cRv.ltD
cB.cRv.ltD
kJ.cRv.ltD
6b.cRv.ltD
2g.cRv.ltD
K6.cRv.ltD
WE.cRv.ltD
jq.cRv.ltD
NY.cRv.ltD
up.cRv.ltD
eu.cRv.ltD
f9.cRv.ltD
21.cRv.ltD
Gu.cRv.ltD
Wn.cRv.ltD
Ol.cRv.ltD
o8.cRv.ltD
Vp.cRv.ltD
qO.cRv.ltD
dA.cRv.ltD
jO.cRv.ltD
NV.cRv.ltD
6p.cRv.ltD
Kw.cRv.ltD
Nv.cRv.ltD
Es.cRv.ltD
qq.cRv.ltD
6q.cRv.ltD
6B.cRv.ltD
g1.cRv.ltD
Ei.cRv.ltD
hP.cRv.ltD
9N.cRv.ltD
Fb.cRv.ltD
bL.cRv.ltD
sT.cRv.ltD
Ln.cRv.ltD
ue.cRv.ltD
96.cRv.ltD
CX.cRv.ltD
vb.cRv.ltD
6H.cRv.ltD
Gm.cRv.ltD
nJ.cRv.ltD
IC.cRv.ltD
xq.cRv.ltD
mn.cRv.ltD
a7.cRv.ltD
1n.cRv.ltD
DP.cRv.ltD
vD.cRv.ltD
vs.cRv.ltD
qF.cRv.ltD
SN.cRv.ltD
MC.cRv.ltD
zm.cRv.ltD
iO.cRv.ltD
vU.cRv.ltD
wq.cRv.ltD
yS.cRv.ltD
7a.cRv.ltD
Hd.cRv.ltD
Jp.cRv.ltD
3C.cRv.ltD
NO.cRv.ltD
d1.cRv.ltD
za.cRv.ltD
qK.cRv.ltD
TO.cRv.ltD
MT.cRv.ltD
aS.cRv.ltD
yF.cRv.ltD
VT.cRv.ltD
61.cRv.ltD
MS.cRv.ltD
Aj.cRv.ltD
Aw.cRv.ltD
5J.cRv.ltD
ds.cRv.ltD
ZH.cRv.ltD
wa.cRv.ltD
p2.cRv.ltD
ZS.cRv.ltD
Bk.cRv.ltD
w6.cRv.ltD
Yt.cRv.ltD
F5.cRv.ltD
lU.cRv.ltD
6k.cRv.ltD
ny.cRv.ltD
zA.cRv.ltD
rh.cRv.ltD
0a.cRv.ltD
oh.cRv.ltD
1F.cRv.ltD
UQ.cRv.ltD
bh.cRv.ltD
HH.cRv.ltD
2o.cRv.ltD
4h.cRv.ltD
Ba.cRv.ltD
b0.cRv.ltD
08.cRv.ltD
PX.cRv.ltD
sz.cRv.ltD
XM.cRv.ltD
ms.cRv.ltD
nM.cRv.ltD
ss.cRv.ltD
aG.cRv.ltD
ow.cRv.ltD
Gx.cRv.ltD
Yy.cRv.ltD
4K.cRv.ltD
x3.cRv.ltD
7g.cRv.ltD
MN.cRv.ltD
EN.cRv.ltD
8K.cRv.ltD
pd.cRv.ltD
Fq.cRv.ltD
6t.cRv.ltD
48.cRv.ltD
Ps.cRv.ltD
f0.cRv.ltD





