原题链接:152. 乘积最大子数组
solution: 动态规划:
maxdp[i]维护一个以i结尾的最大乘积子数组
mindp[i]维护一个以i结尾的最大乘积子数组
为什么需要维护两个数组?
因为本题考虑的是乘积,负数乘负数可以变成正数,而正数乘以负数可以变成负数,因此需要考虑num[i]为正数或负数的两种情况。
转移方程:
maxDP[i + 1] = max(maxDP[i] * A[i + 1], A[i + 1],minDP[i] * A[i + 1])
minDP[i + 1] = min(minDP[i] * A[i + 1], A[i + 1],maxDP[i] * A[i + 1])
class Solution {
public:
int maxProduct(vector<int>& nums) {
vector<int> mindp(nums.size()),maxdp(nums.size());
maxdp[0] = nums[0];
mindp[0] = nums[0]; //初始值
for(int i = 1;i < nums.size();i++) {
maxdp[i] = max(maxdp[i - 1] * nums[i],max(nums[i],mindp[i - 1] * nums[i]));
mindp[i] = min(maxdp[i - 1] * nums[i],min(nums[i],mindp[i - 1] * nums[i]));
}
return *max_element(maxdp.begin(),maxdp.end());
}
};