Leetcode152. 乘积最大子数组
题目:
给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
子数组 是数组的连续子序列。
示例 1:
输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: nums = [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
题解:
动态规划
如果我们用
f
max
(
i
)
f_{\max}(i)
fmax(i)来表示以第 i 个元素结尾的乘积最大子数组的乘积
java代码:
public static int maxProduct(int[] nums) {
int len = nums.length;
int[] maxF = new int[len];
int[] minF = new int[len];
maxF[0] = nums[0];
minF[0] = nums[0];
for (int i = 1; i < len; i++) {
maxF[i] = Math.max(maxF[i - 1] * nums[i], Math.max(nums[i], minF[i - 1] * nums[i]));
minF[i] = Math.min(minF[i - 1] * nums[i], Math.min(nums[i], maxF[i - 1] * nums[i]));
}
int max = maxF[0];
for (int i = 1; i < len; i++) {
max = Math.max(maxF[i], max);
}
return max;
}
/**
* @param nums
* @return
*/
public static int maxProduct2(int[] nums) {
int maxF = nums[0], minF = nums[0], ans = nums[0];
int length = nums.length;
for (int i = 1; i < length; ++i) {
int mx = maxF, mn = minF;
maxF = Math.max(mx * nums[i], Math.max(nums[i], mn * nums[i]));
minF = Math.min(mn * nums[i], Math.min(nums[i], mx * nums[i]));
ans = Math.max(maxF, ans);
}
return ans;
}