题目描述
思路分析
状态机dp
f
[
i
]
:
f[i]:
f[i]:以
i
i
i结尾的最大连续乘积
g
[
i
]
:
g[i]:
g[i]:以
i
i
i结尾的最小连续乘积
f
[
i
]
=
m
a
x
(
f
[
i
−
1
]
∗
n
u
m
s
[
i
]
,
g
[
i
−
1
]
∗
n
u
m
s
[
i
]
,
n
u
m
s
[
i
]
)
;
f[i]=max(f[i-1]*nums[i],g[i-1]*nums[i],nums[i]);
f[i]=max(f[i−1]∗nums[i],g[i−1]∗nums[i],nums[i]);
g
[
i
]
=
m
i
n
(
f
[
i
−
1
]
∗
n
u
m
s
[
i
]
,
g
[
i
−
1
]
∗
n
u
m
s
[
i
]
,
n
u
m
s
[
i
]
)
;
g[i]=min(f[i-1]*nums[i],g[i-1]*nums[i],nums[i]);
g[i]=min(f[i−1]∗nums[i],g[i−1]∗nums[i],nums[i]);
发现可以滚动数组优化。用变量f和g表示。
代码实现
class Solution {
public:
int maxProduct(vector<int>& nums) {
int res=nums[0];
int f=nums[0],g=nums[0];
for(int i=1;i<nums.size();i++){
int fa=f*nums[i],ga=g*nums[i],a=nums[i];
f=max(a,max(fa,ga));
g=min(a,min(fa,ga));
res=max(res,f);
}
return res;
}
};