- 题目
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
- 示例
输入: [2,3,-2,4]
输出: 6
- 算法
max[i]表示以nums[i]点结尾的子数组的最大乘积
min[i]表示以nums[i]点结尾的子数组的最小乘积
对于以nums[i]点结尾的子数组来说,要么只有nums[i],要么nums[i]前面有nums[i-1]
当nums[i]前面有nums[i-1]且num[i]>0时,dp[i] = nums[i] * max[i-1]
当nums[i]前面有nums[i-1]且num[i]<0时,dp[i] = nums[i] * min[i-1]
当nums[i]前面有nums[i-1]且num[i]=0时,dp[i] = 0,与nums[i]前面没有数结果一样
- 代码
public int maxProduct(int[] nums) {
int n = nums.length;
int[] max = new int[n];
int[] min = new int[n];
max[0] = nums[0];
min[0] = nums[0];
int res = max[0];
for (int i = 1; i < n; i++) {
max[i] = Math.max(nums[i], Math.max(nums[i] * max[i-1], nums[i] * min[i-1]));
min[i] = Math.min(nums[i], Math.min(nums[i] * max[i-1], nums[i] * min[i-1]));
res = Math.max(res, max[i]);
}
return res;
}