题目大意:数组中找到一个连续子串,使其乘积最大。数组中至少含有一个元素。
思路:采用动态规划的思想。因为数组中含有负数,且多个负数相乘可能出现为正的情况,所以在动态规划中我们需要记录最小负数。pamin[i]代表子串最后一个元素为nums[i]的最小乘积,pamax[i]代表子串中最后一个元素为nums[i]的最大乘积。
pamin[i]=min(pamin[i-1]*nums[i],pamax[i-1] *nums[i],nums[i])
pamax[i]=max(pamin[i-1]*nums[i],pamax[i-1] *nums[i],nums[i])
public int maxProduct(int[] nums) {
int[] pamin=new int[nums.length];
int[] pamax=new int[nums.length];
int maxProduct=nums[0];
pamin[0]=pamax[0]=nums[0];
for(int i=1;i<nums.length;i++){
pamin[i]=min(pamin[i-1]*nums[i], pamax[i-1]*nums[i], nums[i]);
pamax[i]=max(pamin[i-1]*nums[i], pamax[i-1]*nums[i], nums[i]);
if(maxProduct<pamax[i])
maxProduct=pamax[i];
}
return maxProduct;
}
public int max(int a,int b,int c){
int tmp=Math.max(a, b);
return Math.max(tmp, c);
}
public int min(int a,int b,int c){
int tmp=Math.min(a, b);
return Math.min(tmp, c);
}