Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4]
,
the contiguous subarray [2,3]
has the largest product = 6
.
复杂度都是n^2
public class Solution {
public int maxProduct(int[] nums) {
int ret=Integer.MIN_VALUE;
if(nums==null || nums.length==0)
return 0;
if(nums.length==1)
return nums[0];
for(int i=0;i<nums.length;i++){
int tmp=nums[i];
ret=tmp>ret?tmp:ret;
for(int j=i+1;j<nums.length;j++){
tmp*=nums[j];
ret=tmp>ret?tmp:ret;
}
}
return ret;
}
}
之所以会超时,主要是重复算了,如ABC,算了f(B)=A*B,还算了f(C)=A*B*C 。。但是显然f(C)=f(B)*C,这样就不用重复计算A*B了,算一次就把A*B的状态f(B)存下了
flg[i]表示以i结尾的最大连续乘积,那么增加一个数字,那么flg[i+1]=flg[i]*num[i+1]>nums[i+1]?flg[i]*num[i+1]:nums[i+1]
public class Solution {
public int maxProduct(int[] nums) {
int ret=Integer.MIN_VALUE;
if(nums==null || nums.length==0)
return 0;
if(nums.length==1)
return nums[0];
//flg[i]表示以i结尾的最大 连续乘积,初始化为nums[i]
int[] flg=nums.clone();
for(int i=1;i<nums.length;i++){
int tmp=flg[i-1]*nums[i];
flg[i]=tmp>flg[i]?tmp:flg[i];
}
for(int i=0;i<flg.length;i++){
ret=ret<flg[i]?flg[i]:ret;
}
return ret;
}
}
Wrong Answer
Input:
[-2,3,-4]
Output:
3
Expected:
24
还有负数的情况,前面是负数,现在我i也是负数,相乘最大
public class Solution {
public int maxProduct(int[] nums) {
int ret=Integer.MIN_VALUE;
if(nums==null || nums.length==0)
return 0;
if(nums.length==1)
return nums[0];
//flg[i]表示以i结尾的最大 连续乘积,一般为【正最大】初始化为nums[i]
int[] flg=nums.clone();
//flg2[i]表示以i结尾的最小 连续乘积,一般为【负数最大】,初始化为nums[i]
int[] flg2=nums.clone();
for(int i=1;i<nums.length;i++){
int tmp=flg[i-1]*nums[i];
int tmp2=flg2[i-1]*nums[i];
flg[i]=tmp>flg[i]?tmp:flg[i];
flg[i]=tmp2>flg[i]?tmp2:flg[i];
flg2[i]=tmp<flg2[i]?tmp:flg2[i];
flg2[i]=tmp2<flg2[i]?tmp2:flg2[i];
}
for(int i=0;i<flg.length;i++){
ret=ret<flg[i]?flg[i]:ret;
}
return ret;
}
}