这道题感觉只能用dp做但是不知道怎么做只能又去看我最喜欢的题解了
思路:题解的思路真的很清晰,用两个dp数组
f[i]表示nums[0:i]最大并一定包括nums[i]的子数列乘积,g[i]则表示最小的
遍历nums,用nums[i],nums[i]*f[i-1],nums[i]*g[i-1]的最大值来更新f[i],最小值更新g[i]
这样更新就能保证一定包括上面提到的nums[i],而且f[i]一定是最大,g[i]一定是最小
每次迭代用f[i]更新res的值
class Solution {
public:
int maxProduct(vector<int>& nums) {
int res=nums[0];
int n=nums.size();
vector<int>f(n,0);
vector<int>g(n,0);
f[0]=nums[0];
g[0]=nums[0];
for(int i=1;i<nums.size();++i){
f[i]=max(max(nums[i],f[i-1]*nums[i]),g[i-1]*nums[i]);
g[i]=min(min(nums[i],f[i-1]*nums[i]),g[i-1]*nums[i]);
res=max(res,f[i]);
}
return res;
}
};