题目:给一个浮点数序列,找出最大乘积的连续子序列,并找出这个子序列。
这个题类似leetcode152题,只是多了一步找出子序列。
手撕代码时,只是想到了用动态规划,但却没有找到递推方程。
因为不一定全是正数,所以要考虑到负数负负得正的问题,递推方程为:
max = Math.max(Math.max(maxtmp*num[i], mintmp*num[i]), num[i]);
min = Math.min(Math.min(maxtmp*num[i], mintmp*num[i]), num[i]);
其中,初始为maxtmp=mintmp=num[0]。
代码:
public class Main1 {
public static void main(String[] args) {
// double[] num = new double[]{2,-1,3,4,-6,-2,1};
// double[] num = new double[]{2,3,-2,4};
double[] num = new double[]{-7,2,3,4,-6,-2,1};
double[] n = getMax(num);
for (int i = (int) n[1]; i <=n[2]; i++) {
System.out.print(num[i]+" ");
}
System.out.println(n[0]);
}
private static double[] getMax(double[] num) {
double maxtmp=num[0];
double mintmp=num[0];
double res = num[0];
int index =0;
int last =0;
for (int i = 1; i < num.length; i++) {
double max = Math.max(Math.max(maxtmp*num[i], mintmp*num[i]), num[i]);
double min = Math.min(Math.min(maxtmp*num[i], mintmp*num[i]), num[i]);
maxtmp=max;
mintmp=min;
res = Math.max(res, max);
if(res==max)
last=i;
}
double s = 1;
for (int i = last; i >=0; i--) {
s*=num[i];
if(s==res)
{
index=i;
break;
}
}
System.out.println("start:"+index+"--end:"+last);
return new double[]{res,index,last};
}
}
结果: