给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续 子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32 位 整数。请注意,一个只包含一个元素的数组的乘积是这个元素的值。
示例 1:
输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
这道题可以和 “最大子数组和”对比。都是 dp 问题,但是做法有差异,主要原因是乘法需要考虑负负得正的情况,需要同时记录最大值和最小值。
C++12 linesExpandCollapse
int maxProduct(vector<int>& nums) {
int ans = nums[0], m = nums[0], M = nums[0];
for (int i = 1; i < nums.size(); i++) {
int oldm = m, oldM = M;
m = min(nums[i], nums[i] * oldm, nums[i] * oldM);
M = max(nums[i], nums[i] * oldm, nums[i] * oldM);
ans = max(ans, M);
}
return ans;
}