题目大意:寻找一个子序列,使其乘积达到最大。
解决思路:记f[i]为前i个数能得到的最大乘积。递推公式如下:
f[i]=Max(f[i-1],b[i]);b[i]表示含有nums[i]的最大乘积。
为求b[i],构造一个额外数组temp,temp[i]=nums[i]*nums[i-1]….*nums[j]; j=0或者nums[j-1]=0, nums[i]=0时,temp[i]=0;
用first记录第一次出现负数的位置(如果有0出现,first要重置)。
不难得出:
if temp[i]>=0||i==first , b[i] = temp[i];
else , b[i]=temp[i]/temp[first].
贴代码:
public int maxProduct(int[] nums) {
int[] temp = new int[nums.length];
int re = nums[0];
temp[0]=re;
int first = -1;
if(re<0)
first=0;
for(int i=1;i<nums.length;i++){
if(temp[i-1]!=0)
temp[i]=temp[i-1]*nums[i];
else{
temp[i]=nums[i];
first=-1;
}
if(temp[i]>re)
re=temp[i];
else if(first!=-1){
if(temp[i]/temp[first]>re)
re = temp[i]/temp[first];
}
if(nums[i]<0&&first==-1){
first=i;
}
}
return re;
}