长度为N的整数数组计算任意N-1个数乘积最大的值

 

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;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值