前言
本篇文章来自leedcode,是博主的学习算法的笔记心得。
如果觉得对你有帮助,可以点点关注,点点赞,谢谢你!
题目来源
思路
1.很容易想到,以dp[i]存储以nums[i]结尾的子数组乘积最大值,但是注意有负数
2.维护两个数组,一个记录最大值,一个记录最小值
3.max[i]=max(nums[i],max[i-1]*nums[i],min[i-1]*nums[i])
4.min[i]=min(nums[i],max[i-1]*nums[i],min[i-1]*nums[i])
代码
public int maxProduct(int[] nums) {
if (nums.length==0)return 0;
int[] max=new int[nums.length];
int[] min=new int[nums.length];
int maxNum =max[0]=min[0]=nums[0];
for (int i = 1; i < nums.length; i++) {
max[i]=Math.max(nums[i],Math.max(max[i-1]*nums[i],min[i-1]*nums[i]));
min[i]=Math.min(nums[i],Math.min(max[i-1]*nums[i],min[i-1]*nums[i]));
maxNum=Math.max(maxNum,max[i]);
}
return maxNum;
}