最大子序列的乘积,两种方法:
1.方法一的时间复杂度为O(n^2),这个方法是通过循环遍历所有的子序列。
public static int maxSubMulti(int[] a){
int maxsub = 0;
int minsub = 0;
for(int i = 0 ; i < a.length ; i++){
int temp = 1;
for(int j = i; j < a.length; j++){
temp *= a[j];
if(temp > maxsub){
maxsub = temp;
}
if(temp < minsub){
minsub = temp;
}
}
}
return maxsub;
}
2.方法二是动态规划的方法。时间复杂度是O(N),通过求子序列(i,j)和a[i],的最大最小值,来更新序列的最大最小值。
public static int maxMulti(int[] a){
int[] maxsub = new int[a.length];
int[] minsub = new int[a.length];
maxsub[0] = a[0];
minsub[0] = a[0];
int maxval = maxsub[0];
for(int i = 1 ; i < a.length ; i++){
maxsub[i] = max3(a[i],maxsub[i - 1] * a[i],minsub[i - 1] * a[i]);
minsub[i] = min3(a[i],minsub[i - 1] * a[i],maxsub[i - 1] * a[i]);
if(maxval < maxsub[i]){
maxval = maxsub[i];
}
}
return maxval;
}