程序员代码面试指南刷题--第八章.数组中子数组的最大累乘积

题目描述
给定一个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;
    }
}

你可能感兴趣的:(程序员代码面试指南刷题)