Leetcode 152、乘积最大子数组
这里和最大子数组的和不同,子数组的和出现负数一定会让当前的和减少,但是对于乘积来说,如果出现了两个负数会让乘积变大。
所以这里不能只使用一个dp数组来进行解题,对于一个dp数组来说,没有办法考虑两个负数没有相邻的情况,比如:nums = {-2,3,-4}。
下面的代码里面使用两个数组维护当前可以得到的最小值和当前可以得到的最大值,因为数组里面有正有负,所以最大值在下一个位置可能变成最小值,最小值可能在下一个位置变成最大值。这样就可以考虑到负数不相邻的情况。
class Solution {
public int maxProduct(int[] nums) {
int length = nums.length;
int[] maxF = new int[length];
int[] minF = new int[length];
System.arraycopy(nums, 0, maxF, 0, length);
System.arraycopy(nums, 0, minF, 0, length);
for (int i = 1; i < length; ++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 ans = maxF[0];
for (int i = 1; i < length; ++i) {
ans = Math.max(ans, maxF[i]);
}
return ans;
}
}