题目描述
给定一个double类型的数组arr,其中的元素可正、可负、可0,返回子数组累乘的最大乘积。例如,arr=[-2.5, 4, 0, 3, 0.5, 8, -1],子数组[3, 0.5, 8]累乘可以获得最大的乘积12,所以返回12
[要求]
时间复杂度为O(n)O(n)O(n),空间复杂度为O(1)O(1)O(1)
输入描述:
第一行一个整数N。表示数组长度。
接下来一行N个浮点数表示数组内的数
输出描述:
输出一个浮点数表示答案,保留到小数点后两位
示例1
输入
7
-2.5 4 0 3 0.5 8 -1
输出
12.00
解法一:动态规划
注意:格式输出保留小数点后两位的表达方式
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int len = Integer.parseInt(br.readLine());
String[] ss = br.readLine().trim().split(" ");
double[] arr = new double[len];
for(int i=0;i<len;i++){
arr[i] = Double.parseDouble(ss[i]);
}
double res = getRes(arr);
System.out.println(String.format("%.2f",res));
}
public static double getRes(double[] arr){
if(arr==null||arr.length==0) return 0;
double min = arr[0];
double max = arr[0];
double tmpmin = 0;
double tmpmax = 0;
double res = arr[0];
for(int i=1;i<arr.length;i++){
tmpmin = min*arr[i];
tmpmax = max*arr[i];
min = Math.min(Math.min(tmpmin,tmpmax),arr[i]);
max = Math.max(Math.max(tmpmin,tmpmax),arr[i]);
res = Math.max(res,max);
}
return res;
}
}