// 乘积最大子数组-动态规划
// 输入: nums = [2,3,-2,4]
// 输出: 6
// 解释: 子数组 [2,3] 有最大乘积 6。
public static int maxProductOne(int[] nums){
int len=nums.length;
int[] maxF=new int[len];
int[] minF=new int[len];
System.arraycopy(nums,0,maxF,0,len);
System.arraycopy(nums,0,minF,0,len);
for (int i = 1; i <len ; i++) {
// nums[i]为正数 maxF[i-1]*nums[i]
// nums[i]为负数 minF[i-1]*nums[i] ,nums[i]
maxF[i]=Math.max(maxF[i-1]*nums[i],
Math.max(nums[i],minF[i-1]*nums[i]));
// nums[i]为正数 minF[i-1]*nums[i]
// nums[i]为负数 maxF[i-1]*nums[i] ,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 <len ; i++) {
ans=Math.max(ans,maxF[i]);
}
return ans;
}
public static int maxProduct(int[] nums){
int maxF=nums[0],minF=nums[0],ans=nums[0];
int len=nums.length;
for (int i = 1; i <len ; i++) {
int mx=maxF,mn=minF;
maxF=Math.max(mx*nums[i],Math.max(nums[i],mn*nums[i]));
minF=Math.min(mn*nums[i],Math.min(nums[i],mx*nums[i]));
ans=Math.max(maxF,ans);
}
return ans;
}
乘积最大子数组-动态规划
最新推荐文章于 2025-12-26 16:25:00 发布
文章介绍了如何使用动态规划解决编程问题,给出了两个方法:maxProductOne和maxProduct,分别计算给定整数数组中的最大乘积子数组。这两个函数通过维护最大值和最小值数组来追踪可能的乘积变化。

728

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



