给定一个长度为N的整数数组,只允许用乘法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。
最容易想到的就是通过一次遍历把所有(N-1)个数的组合找出来,分别计算他们的乘积,并比较大小。由于总共有N个(N-1)个数的组合,总的时间复杂度为O(N的2次方),显然这不是最好的解决办法。
且看下面的实现方法,当然也是比较简单的,毕竟没太多时间思考,他的时间复杂度只有O(N)。
当然肯定有其他的方式解决这个问题,blog友如果有好的方式可以贴出来分享。谢谢!
package org.blogjava.arithmetic;
import java.util.ArrayList;

/** *//**
* @author Jack.Wang
* @see ORATION: underline">http://jack2007.blogjava.net/
*/
public class Array<E> extends ArrayList<E>
{
private static final long serialVersionUID = 7799621696481440826L;

private static long maxOfSubArray(Array arr)
{
// 最大值
long max = 0;
int size = arr.size();
// s[i]表示前i个元素的乘积,可知s[i]=s[i-1]*arr.get(i-1) 其中(1<=i<=N)
long[] s = new long[size + 1];
s[0] = 1;
// t[i]表示i后面元素的乘积,可知t[i]=t[i+1]*arr.get(i) 其中(1<=i<=N)
long[] t = new long[size + 1];
t[size] = 1;
// 设p[i]为除第i个元素之外的其他元素之积,即:p[i]=s[i-1]*t[i+1];
long[] p = new long[size + 1];
// 求出 s数组
for (int i = 1; i <= size; i++)
{
s[i] = s[i - 1] * ((Integer) arr.get(i - 1));
}
// 求出t数组
for (int i = size - 1; i >= 0; i--)
{
t[i] = t[i + 1] * ((Integer) arr.get(i));
}
// 计算 p数组
for (int i = 1; i <= size; i++)
{
p[i] = s[i - 1] * t[i];
if (p[i] > max)
{
max = p[i];
}
}
return max;
}

public static void main(String[] args)
{
Array<Integer> array = new Array<Integer>();
array.add(1);
array.add(4);
array.add(6);
array.add(10);
array.add(12);
array.add(40);
// 上面的数字很简单,口算也知道N-1个最大乘积为115200
// 算法结果:
System.out.println(" 算法结果:" + maxOfSubArray(array));
}
}