给定一个长度为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