简单的dp,需要注意考虑0以及只有一个负数的情况
class Solution {
public int maxProduct(int[] nums) {
int len = nums.length;
// 以下标结尾的最大乘积
int[][] dp = new int[len][2];
if(nums[0] > 0) {
dp[0][0] = nums[0];
} else if(nums[0] < 0) {
dp[0][1] = nums[0];
}
int ans = nums[0];
for(int i = 1;i < len;i++) {
if(nums[i] > 0) {
dp[i][0] = dp[i - 1][0] == 0 ? nums[i] : dp[i - 1][0] * nums[i];
dp[i][1] = dp[i - 1][1] * nums[i];
} else if(nums[i] < 0) {
dp[i][1] = dp[i - 1][0] == 0 ? nums[i] : dp[i - 1][0] * nums[i];
dp[i][0] = dp[i - 1][1] * nums[i];
}
ans = Math.max(dp[i][0], ans);
}
return ans;
}
}

这段代码展示了如何使用动态规划解决寻找数组中连续子数组的最大乘积问题,特别注意了0和唯一负数的情况。初始状态根据第一个元素设置,然后逐个遍历数组更新最大正乘积和负乘积,最后返回最大乘积。
1298

被折叠的 条评论
为什么被折叠?



