题目:
给定一个double类型的数组arr,其中的元素可正、可负、可为0。返回子数组累乘的最大乘积。
思路:
假设以arr[i-1]结尾的数组最小累乘积为min,最大累乘积为max,那么以arr[i]结尾的数组的最大累乘积可能有三种情况。
- max*arr[i];如:[3,4,5]算到5时。
- min*arr[i];如:[-3,4,-5]算到-5时。
- arr[i];如:[0.3,0.4,5]算到5时。
public static double maxProduct(double[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
double max = arr[0];
double min = arr[0];
double res = arr[0];
double maxEnd = 0;
double minEnd = 0;
for (int i = 1; i < arr.length; ++i) {
maxEnd = max * arr[i];
minEnd = min * arr[i];
max = Math.max(Math.max(maxEnd, minEnd), arr[i]);
min = Math.min(Math.min(maxEnd, minEnd), arr[i]);
res = Math.max(res, max);
}
return res;
}