题目描述:
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
【题解】:
我不太会动态规划,之前遇到过类似的问题,既有正数也有负数,如何求最大的值,问了身边的人:同时保存两个值,一个最大值,一个最小值。列出状态转移方程,每一步记录从0到当前位置i的最小值与最大值。最后选择一个最大的值。
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
int a[n + 1][2];
a[0][0] = a[0][1] = nums[0];
int m = nums[0];
for (int i = 1; i < n; i ++ )
{
a[i][0] = max(nums[i], max(a[i - 1][0] * nums[i], a[i - 1][1] * nums[i]));
a[i][1] = min(nums[i], min(a[i - 1][0] * nums[i], a[i - 1][1] * nums[i]));
m = max(max(a[i][0], a[i][1]), m);
}
return m;
}
};