问题:给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组,并写出算法的时间复杂度。
解法1:
计算(N-1)个数的组合乘积,假设第i(0 <= i <= N-1)个元素被排除在乘积之外。
设array[]为初始数组,令s[i]表示元素array[i]前所有元素的乘积,0 <= i <= N-1,其中s[0]=1(边界条件),t[i]表示元素array[i]后所有元素的乘积,0 <= i <= N-1,其中,t[N-1] =1(边界条件),那么有,p[i]=s[i]*t[i]。
s[]和t[]可以通过从头至尾和从尾至头扫描两次得到,进而在线性的时间得到p[],再遍历p[]一次得到最大值。时间复杂度为O(N)。
解法2:
首先计算N个整数的乘积p,针对p的正负性进行如下分析。
(1)p为0
那么,数组中至少包含有一个0.假设除去一个0之外,其他N-1个数的乘积为Q,根据Q的正负性进行讨论:
Q为0
说明数组中至少有两个0,那么N-1个数的乘积只能为0,返回0;
Q为正数,则N-1个数的乘积最大值为Q,返回Q;
Q为负数,则N-1个数的乘积最大值为0,返回0;
(2)p为负数
扫描一遍数组,把绝对值最小的负数给去掉,就得到N-1个数的乘积最大值。
(3)p为正数,应该去掉最小的正数值,否则去掉绝对值最大的负数值。
上面的解法采用于直接N个整数的乘积p,进而判断p的正负性的办法,但是直接求乘积在编译环境下往往会有溢出的危险,所以事实上我们可以做一个小转弯,不需要直接求乘积,而是求出数组中正数、负数和0的个数,从而判断p的正负性,其余部分与上面的解法相同。时间复杂度为O(N)。