所以这是最近的一个采访问题,给定一个正整数n,将其分解为至少两个正整数的总和,并最大化这些整数的乘积。返回您可以获得的最大产品。
例如,给定n = 2,返回1(2 = 1 + 1);给定n = 10,返回 36(10 = 3 + 3 + 4)。
我试图递归地解决它,方法是 首先将数字分成两半,找到最大乘积并保持每半分裂,直到达到最大值。
这是我的代码,
private int integerBreak(int n, int maxProduct){
int index = 0;
for(int i=0; i<n; i++){
if((i * (n-i)) >maxProduct) {
maxProduct = i*(n-i);
index = i;
}
}
return integerBreak(index, index) * integerBreak(n - index, n-index);
}
public int integerBreak(int n) {
int maxProduct = 0;
return integerBreak(n, maxProduct);
}
现在我对如何终止递归的基本条件有点失落。如果有人可以帮我解决问题而不是想出完全不同的解决方案,我会很感激。
答案 0 :(得分:2)
我编写了一个简单的Java应用程序来计算数字2到20的整数之和的最大乘积。第一个数字是总和。中间的数字是总和的因素。最终的数字是因素的乘积。结果如下。
2 [1, 1] 1
3 [2, 1] 2
4 [2, 2] 4
5 [3, 2] 6
6 [3, 3] 9
7 [4, 3] 12
8 [3, 3, 2] 18
9 [3, 3, 3] 27
10 [4, 3, 3] 36
11 [3, 3, 3, 2] 54
12 [3, 3, 3, 3] 81
13 [4, 3, 3, 3] 108
14 [3, 3, 3, 3, 2] 162
15 [3, 3, 3, 3, 3] 243
16 [4, 3, 3, 3, 3] 324
17 [3, 3, 3, 3, 3, 2] 486
18 [3, 3, 3, 3, 3, 3] 729
19 [4, 3, 3, 3, 3, 3] 972
20 [3, 3, 3, 3, 3, 3, 2] 1458
calculateMaximumFactors方法使用最大乘积计算因子。因子方法生成总和的因子。产品方法计算因子的乘积。这是代码:
package com.ggl.testing;
import java.util.Arrays;
public class MaximumProduct {
public static void main(String[] args) {
for (int sum = 2; sum <= 20; sum++) {
System.out.print(sum + " ");
System.out.println(calculateMaximumFactors(sum));
}
}
private static String calculateMaximumFactors(int sum) {
int[] previousFactors = new int[0];
int maxProduct = 0;
for (int i = 2; i <= sum; i++) {
int[] factors = factor(sum, i);
int product = product(factors);
if (product > maxProduct) {
maxProduct = product;
previousFactors = Arrays.copyOf(factors, factors.length);
}
}
return Arrays.toString(previousFactors) + " " + maxProduct;
}
private static int[] factor(int sum, int divisor) {
if (sum < divisor) {
return new int[0];
}
int num = sum / divisor;
int remainder = sum % divisor;
int[] result = new int[divisor];
for (int i = 0; i < divisor; i++) {
result[i] = num;
if (remainder > 0) {
result[i]++;
remainder--;
}
}
return result;
}
private static int product(int[] factors) {
int product = 1;
for (int i = 0; i < factors.length; i++) {
product *= factors[i];
}
return product;
}
}
答案 1 :(得分:0)
这是我解决问题的方法:(想法:将整数分解为3的倍数是最佳的)
public int integerBreak(int n) {
// base case :
if (n == 2 || n == 3){
return (n-1);
}
int maxProduct = 1;
while (n > 4){
n -= 3;
maxProduct *= 3; // Keep multiplying 3.
}
return (n * maxProduct); // multiply with left over n.
}
这是简单的O(N)解决方案。希望这有助于某人!
答案 2 :(得分:0)
这个想法是将数字分成2或3的倍数。如果你写出7到10之类的数字的破解结果,你应该得到这个想法。假设最大数量为60,则有一个简单的动态解决方案:
int dp[60];
public:
int integerBreak(int n)
{
dp[1]=1,dp[2]=1,dp[3]=2,dp[4]=4,dp[5]=6,dp[6]=9;
for(int i=7;i<=n;i++)
dp[i]=max(dp[i-3]*3,dp[i-2]*2);
return dp[n];
}
};
答案 3 :(得分:-1)
如果你做一个循环试图找到数字然后会变得复杂而不是那么有效(数字越大,你找到它的时间越长,你需要考虑索引等等)
最好也是最快算法是中点算法,即将给定数除以2,如果数为奇数则计算偏差,最后计算产品
static int func(int number) {
int result = 0;
if (number < 0) {
System.err.println("no negative allowed");
System.exit(0);
}
int a = 0;
int b = 0;
a = number / 2;
b = number / 2;
a += number - (a + b);
result = a * b;
System.out.println(" this is a " + a);
System.out.println(" this is b " + b);
return result;
}
如果你像
那样执行它public static void main(String[] args) {
int number = 9;
int result = func(number);
System.out.println(result);
}
会正确得到结果......