public static List < List < Integer >> combinations(int n, int k) {
List < List < Integer >> result = new ArrayListof);
directedCombinations(n, k, 1, new ArrayList < Integer > (), result);
return result;
}
private static void directedCombinations(int n, int k, int offset,
291 List < Integer > partialCombination,
ListcList < Integer >> result) {
if (partialCombination.size() == k) {
result.add(new ArrayList < > (partialCombination));
return;
}
// Generate remaining combinations over {offset , ...» n - 1} of size
// numRemaining.
final int numRemaining = k - partialCombination.size();
for (int i = offset; i <= n && numRemaining <= n - i + 1; ++i) {
partialCombination.add(i);
directedCombinations(n, k, i + 1, partialCombination, result);
partialCombination.remove(partialCombination.size() - 1);
}
}
此解决方案的时间分析是什么,我的书说它是O(n * nCk)? nCk是有意义的,但是不知道为什么它是n * nCk。感谢您的帮助。
答案 0 :(得分:0)
因为这一行:
result.add(new ArrayList < > (partialCombination));
您已经生成了C(n,k)
个解决方案。现在,您将对每个阵列执行数组创建。这花费的时间与其大小成正比,即O(k)
。因此,更确切地说时间是O(k * C(n,k))
。
因此,如果您不必输出数组,而是返回1
或数组中数字的总和,则可以使算法在O(C(n,k))
中运行。 / p>