一、题目
给定一个长度为n的整数数组,只允许使用乘法,不能使用除法,请计算任意n-1个数的组合中乘积最大的一组,并写出算法的时间复杂度。
二、方法一:暴力求解(O(n^2))
static int b[] = new int[] { 1, 2, 4, -1, 2, 5 };
static int flag[] = new int[b.length];
static int result;
public static void main(String[] args) {
getResult2(0);
System.out.println(result);
}
/**
* 暴力
*/
public static void getResult2(int index) {
if (index == b.length - 1) {
int temp = 1;
for (int i = 0; i < flag.length; i++) {
if (flag[i] != 0) {
temp = temp * b[i];
}
}
if (temp > result) {
result = temp;
}
return;
} else {
for (int i = 0; i < flag.length; i++) {
if (flag[i] == 0) {
flag[i] = 1;
getResult2(index + 1);
flag[i] = 0;
}
}
}
}
三、方法二:动态规划(O(n))
/**
* O(n)
*/
public static void getResult() {
int a[] = new int[] { 1, 2, 4, -1, 3, -5 };
int i;
int N = a.length;
int s[] = new int[N];// s[i]表示数组前i个元素的乘积
int t[] = new int[N + 1];// t[i]表示数组后N-i个元素的乘积
int p[] = new int[N + 1];
s[0] = 1;
t[N] = 1;
for (i = 1; i <= N - 1; i++)
s[i] = s[i - 1] * a[i - 1];
for (i = N - 1; i >= 1; i--)
t[i] = t[i + 1] * a[i];
for (i = 1; i <= N; i++)
p[i] = s[i - 1] * t[i];
int max = 1;
for (i = 1; i <= N; i++) {
if (p[i] >= max) {
max = p[i];
}
}
System.out.println(max);
}
不乱于心,不困于情。不畏将来,不念过往。如此,安好!