给你一个整数数组 nums
,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
示例 1:
输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: nums = [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
提示:
1 <= nums.length <= 2 * 104
-10 <= nums[i] <= 10
nums
的任何前缀或后缀的乘积都 保证 是一个 32-位 整数
动态规划:假设f[i]为到i为止的最大乘积,g[i]为到i为止的最小乘积
则f[i] = max(f[i-1]*nums[i], g[i-1]*nums[i], nums[i])
g[i] = min(f[i-1]*nums[i], g[i-1]*nums[i], nums[i])
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
int minP = 1;
int maxP = 1;
int res = nums[0];
for (int i = 0; i < nums.size(); i++) {
int val = nums[i];
int mini = minP * val;
int maxi = maxP * val;
minP = std::min(std::min(mini, maxi), val);
maxP = std::max(std::max(mini, maxi), val);
res = std::max(res, maxP);
}
return res;
}
};