package com.java.ly2011.bczm;
/**
* 长度为N的整数数组计算任意N-1个数乘积最大的值
* 复杂度O(n)
* s[i]=a[0]*a[1]....*a[i]
* t[i]=a[i]*a[i+1]...*a[n] t[n+1] =1;
* p[i]=a[0]*a[1]....*a[i-1]*a[i+1]...*a[n] 即不包括a[i]的所有数的乘积
* = s[i-1]*t[i+1]
* p[0]=t[1];
*
*
* 正向遍历求得s O(n)
* 反向遍历求的t O(n)
* 一次循环求的p O(n)
* 递归求最大值(p数组) (3/2)n-2
* @author ly
*
*/
public class MaxChengJiInSubArray {
public static void main(String[] args) {
int[] a = new int[]{6,4,3,10,5};
System.out.println(maxProductInArray(a));
}
public static int maxProductInArray(int[] a){
int[] s = new int[a.length];
s[0]=a[0];
for(int i=1;i<a.length;i++)
s[i]=s[i-1]*a[i];
int[] t = new int[a.length+1];
t[a.length]=1;
for(int i=a.length-1;i>=0;i--)
t[i]=t[i+1]*a[i];
int[] p = new int[a.length];
p[0]=t[1];
for(int i = 1 ;i<p.length;i++)
p[i]=s[i-1]*t[i+1];
int max = getMaxInArrayRe(p, 0, p.length-1);
return max;
}
public static int getMaxInArrayRe(int[] a , int left ,int right){
if( (right-left+1)>a.length )
return 0;
int max;
if(left==right)
max = a[left];
else{
int mid = (left+right)/2;
int maxLeft = getMaxInArrayRe(a, left, mid);
int maxRifht = getMaxInArrayRe(a, mid+1, right);
max = maxLeft>maxRifht?maxLeft:maxRifht;
}
return max;
}
}