题目
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.
分析
动态规划
因为负负得正,所以要记录负数的最大值。 两次动态规划。
class Solution {
public static int maxProduct(int[] nums) {
int[] dpp = new int[nums.length];
int[] dpn = new int[nums.length];
dpp[0] = nums[0] > 0 ? nums[0] : 0;
dpn[0] = nums[0] > 0 ? 0 : nums[0];
int retn = dpn[0];
int retp = dpp[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i] > 0) {
dpp[i] = (dpp[i - 1] == 0 ? 1 : dpp[i - 1]) * nums[i];
dpn[i] = (dpn[i - 1] == 0 ? 0 : dpn[i-1])*nums[i];
} else if (nums[i] < 0) {
dpn[i] = (dpp[i - 1] == 0 ? 1 : dpp[i - 1]) * nums[i];
dpp[i] = (dpn[i - 1] == 0 ? 0 : dpn[i-1])*nums[i];
} else {
dpp[i] = 0;
dpn[i] = 0;
}
retp= Math.max(dpp[i], retp);
retn = Math.max(dpn[i],retn);
}
if (retp==0) {
return retn;
}
return retp;
}
}
看到leetcode上解答还有左右各遍历一次的