Leetcode 152、乘积最大子数组

动态规划
min数组存储到目前位置最小的乘积,max数组存储到目前位置最大的乘积
- 遍历nums数组,如果当前位置小于0
min[i] = Math.min(max[i - 1] * nums[i], nums[i]);
max[i] = Math.max(min[i - 1] * nums[i], nums[i]);
- 遍历nums数组,如果当前位置大于等于0
min[i] = Math.min(min[i - 1] * nums[i], nums[i]);
max[i] = Math.max(max[i - 1] * nums[i], nums[i]);
- 完整代码
class Solution {
public int maxProduct(int[] nums) {
int len = nums.length;
int[] min = new int[len];
int[] max = new int[len];
min[0] = nums[0];
max[0] = nums[0];
int result = max[0];
for(int i = 1; i < len; i++) {
if(nums[i] < 0) {
min[i] = Math.min(max[i - 1] * nums[i], nums[i]);
max[i] = Math.max(min[i - 1] * nums[i], nums[i]);
}else{
min[i] = Math.min(min[i - 1] * nums[i], nums[i]);
max[i] = Math.max(max[i - 1] * nums[i], nums[i]);
}
result = Math.max(result, max[i]);
}
return result;
}
}
这篇博客探讨了如何使用动态规划算法解决LeetCode上的152题——求解数组中乘积最大的子数组。通过维护两个辅助数组min和max,分别记录到当前位置的最小乘积和最大乘积,巧妙地处理了负数的情况。最终返回max数组中的最大值作为结果。
808

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



