给定一个整数数组 nums
,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
这里用动态规化的方法,即dp[i]为以i结尾乘积最大连续数值,注意,由于有负数的存在,需要同时记录最大值与最小值,因为负数的最小值再与正数可能出现最大值,所以用dp[i][0]表示最大值,dp[i][1]表示最小值,考虑到特殊情况,每次求最大值和最小值都要与当前数组nums[i]比较。实际上不需要记录下所有dp[i],只需记录当前的dp和上一个状态的dp[i],所以用滚动数组技巧
class Solution {
public:
int maxProduct(vector<int>& nums)
{
vector<vector<int>> dp(2, vector<int>(2, 0));
dp[0][0]=nums[0]; // 正最大值
dp[0][1]=nums[0]; // 最小值
int n=nums.size();
int res=nums[0];
int x,y;
for(int i=1;i<n;i++)
{
x=i%2; // 滚动数组
y=(i-1)%2; // 滚动数组
dp[x][0]=max(dp[y][0]*nums[i],dp[y][1]*nums[i]);
dp[x][0]=max(dp[x][0],nums[i]);
dp[x][1]=min(dp[y][1]*nums[i],dp[y][0]*nums[i]);
dp[x][1]=min(dp[x][1],nums[i]);
res=max(res,dp[x][0]);
}
return res;
}
};