题目描述
给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
题解
仿照最大连续序列和的思想,采用动态规划。dp1[i]表示以nums[i]结尾的序列的最大序列乘积。
但是乘法与加法不同的是,乘法中乘于一个负数可以将原来最小的数变成最大的数。所以这里需多用一个数组统计以nums[i]结尾的最小序列乘积,用于解决符号问题。
代码
class Solution {
public:
int maxProduct(vector<int>& nums) {
int len = nums.size();
int max_val = 1 << 30, min_val = -(1 << 30), res = min_val;
vector<int>dp1(len, min_val);//存放以nums[i]结尾的最大的序列乘积
vector<int>dp2(len, max_val);//存放以nums[i]结尾的最小的序列乘积(用于解决符号问题)
for(int i = 0; i < len; ++i){
if(i == 0){
dp1[i] = nums[i];
dp2[i] = nums[i];
}
else{
dp1[i] = max(nums[i], max(dp1[i - 1] * nums[i], dp2[i - 1] * nums[i]));
dp2[i] = min(nums[i], min(dp1[i - 1] * nums[i], dp2[i - 1] * nums[i]));
}
res = max(res, dp1[i]);
}
return res;
}
};