152 乘积最大子数组

152. 乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。

子数组 是数组的连续子序列。

示例

输入: nums = [2,3,-2,4]

输出: 6

解释: 子数组 [2,3] 有最大乘积 6。

思路:

乘积无非三种组合

  • 全是正的
  • 全是负的
  • 有正有负

其实我们只需要考虑第三种情况就可以了,我们发现如果,出现负数,我们之前的最大值就会变成最小值,最小值变为最大值。

所以我们不关要维护最大值,还需要维护个最小值。

综上,我们可以写出如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
int maxProduct(vector<int>& nums) {
int res_max = INT_MIN, imax = 1, imin = 1;
for(int i = 0; i < nums.size(); i++){
if(nums[i] < 0){
swap(imax, imin);
}
imax = max(imax * nums[i], nums[i]);
imin = min(imin * nums[i], nums[i]);

res_max = max(res_max, imax);
}
return res_max;
}
};