编程之美--求数组的子数组的最大乘积

 给定一个长度为N的整数数组,只允许用乘法不允许用除法,计算N-1个数组合的乘积最大的一组,并写出算法的时间复杂度。   

关键点:整数数组,不使用除法

方法一: 

最简单的计算就是把所有N-1个数的组合全找出来,共有 N 种情况,所以算法的复杂度为Ο(N2)。

方法二:

对于数组A[N],假设这样思考假设去除第i个元素的乘积可以表示为A[0]*A[1]*…A[i-1] * A[i+1]*A[i+2]*…A[N-1],则可以写出如下算法满足复杂度为Ο(N)。  1.算出A[0]~A[N-1],N个元素的乘积赋值给M  2.定义变量i=N-1, R=1,和数组p[N]  3.如果i==0 p[0] = A[0] 返回  4.如果i>=0 重复步骤5  5.M /= A[i]; p[i] = M*R; R *= A[i]   但是本算法使用了除法,而规定不允许,所以可以做个小的调整。设f[i]=A[0]*A[1]*…A[i], r[i]=A[i]*A[i+1]*…A[N]则p[i] = f[i-1]*r[i+1]。

方法三:

虽然以上算法已经将复杂度降到了Ο(N)了,但还是可以进一步减少计算量。子数组最大乘积问题可以分为以下几种情况。  

假设N个整数的乘积为P,针对P的正负性进行如下分析(其中,An-1表示N-1个数的组合,Pn-1表示N-1个数的组合的乘积)

1 P为0

那么,N个数中至少有一个0,计算除0以外的N-1个数的乘积Q

Q为0

说明数组中至少有两个0,那么N-1个数的最大乘积就是0

Q为正数

返回Q

Q为负数

返回0

2 P为正数

如果数组中存在正数值,就去除一个最小的正数,如果不存在正数,就去除一个最小的负数

3 P为负数

去除数组中最大的负数



http://www.cnblogs.com/fly1988happy/archive/2011/12/19/2293604.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值