描述:
给定一个double类型的数组arr,其中的元素可正、可负、可0,返回子数组累乘的最大乘积。例如,arr=[-2.5, 4,0,3,0.5, 8,-1],子数组[3,0.5, 8]累乘可以获得最大的乘积12,所以返回12。
思路:
arr【i】表示到i位置时得到的最大累乘积
到i位置时,只有以下三种可能:
1.可能是max*arr[i]。max既然表示以arr[i-1]结尾的最大累乘积,那么当然有可能;以a[i]结尾的最大累乘积是max*arr[i]。例如,[3,4,5]在 算到5的时候。
2. 可能是min*arr[i]。min既然表示以af[i-1]结尾的最小累乘积,当然有可能min是
负数,而如果ar[i也是负数,两个负数相乘的结果也可能很大。例如,[-2,3.-4]在算到-4的时候。
3. 可能仅是a[i]的值。以a[i]结尾的最大累乘积并不一定非要包含ar[i]之前的数。
例如,[0.1,0.1,100]在 算到100的时候。
这三种可能的值中最大的那个就作为以i位置结尾的最大累乘积,最小的作为最小累乘积,继续计算。
public int maxPr0duct (int[] arr) {
if (arr == null || arr.length == 0) return 0;
int max = arr[0] ;
int min = arr[0] ;
int res = arr[0] ;
int maxEnd = 0;
int 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;
}