分析
此题可以运用动态规划解决:
设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么
f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]}
g[i+1] = min{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]}
考虑到f[i],g[i]只和i-1有关,那么可以用局部变量即可搞定,而不用使用数组。
public class Solution {
public double maxProduct(double[] arr) {
if(arr.length == 1) {
return arr[0];
}
double lastMax = arr[0];
double lastMin = arr[0];
double res = arr[0];
for(int i = 1; i < arr.length; i++) {
double num1 = lastMin * arr[i];
double num2 = lastMax * arr[i];
lastMax = Math.max(Math.max(num1,num2),arr[i]);
lastMin = Math.min(Math.min(num1,num2),arr[i]);
res = Math.max(res,lastMax);
}
return res;
}
}