我正在解决一些Java算法分析问题,而这个问题使我感到困惑。此特定问题要求x(10)返回的值,其中x是以下函数:
public static int x(int n)
{
int count = 0;
for(int i = 0; i <= n; i++)
{
for (int j = 0; j <= n; j++)
{
for (int k = 0; k <= n; k++)
{
System.out.println(i+","+j+","+k);
if (i + j + k > 2 * n)
count++;
}
}
}
return count;
}
本质上,问题是要求小于n且和大于n * 2的3个整数的组合数目。
什么是最快的解决问题的技术,而仅仅是一般的“复杂”嵌套循环问题?
我建立了一个变量表,并跟踪代表三个整数的变量a,b和c,以及一个计数变量,每当'a + b + c> n * 2'但在n = 3之后,计数变量都会递增桌子变得不必要地乏味。必须有一个数学解。
x(10)返回220,但我不知道算法如何得出该答案以及如何找到x(7)。
答案 0 :(得分:0)
您的代码不正确。
i < n,
j < n,
k < n,
因为您提到“少于”。
正如您提到的“组合”,但是您的代码不会删除某些重复的组合,例如,如果n = 5,则只有两个满足条件的组合,它们分别是(4,4,4 )和(4,4,3),结果是2, 显然,您的代码将返回更大的数字,这是不正确的。
这个问题的结果可能是数学表达式吗?考虑下面的等式:
n1 + n2 + n3 = 2 * n
该方程式是一个典型的称为“ Diophantine方程式”的事实,证明 没有通用的算法可以解决所有问题,而且该方程式与起源问题有关,所以我想不。
我更改了您的代码,使用哈希集删除所有重复的组合,希望对您有所帮助。
public static int getCombinationNumber(int num) {
HashSet<String> hs = new HashSet(); // To save the unic form (or representation) for each combination
int count = 0;
for (int i = 0; i < num; i++)
for (int j = 0; j < num; j++)
for (int k = 0; k < num; k++) {
int[] nums = {i, j, k};
sort(nums); // To ensure all the combinations of i, j, k form a unic array
String unicForm = Arrays.toString(nums); // Convert array to string in order to compare and save
if (i + j + k > 2 * num && !hs.contains(unicForm)) {
count++;
hs.add(unicForm);
System.out.println(i + ", " + j + ", " + k);
}
}
return count;
}