1.题目描述

152. 乘积最大子数组

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

示例 1:

1
2
3
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

1
2
3
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

2.代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public int maxProduct(int[] nums) {
//总的数组的最大乘积
int max = Integer.MIN_VALUE;

//以当前节点为根节点的最大子数组的最大乘积
int subMax = 1;

//由于存在负数,那么会导致最大的变最小的,最小的变最大的。
//因此还需要维护 以当前节点为根节点的最大子数组的最小乘积
int subMin = 1;

//枚举数组
for (int i = 0; i < nums.length; i++) {
//负数的处理
if (nums[i] < 0){
int temp = subMax;
subMax = subMin;
subMin = temp;
}

//根据遍历的结点刷新到以当前节点为终结节点的最大值,最小值
subMax = Math.max(nums[i], nums[i] * subMax);
subMin = Math.min(nums[i], nums[i] * subMin);

//更新最大值
max = Math.max(subMax, max);
}

return max;
}
}