【发布时间】:2021-12-20 22:34:38
【问题描述】:
我试图了解使用回溯的时间复杂度。问题是
给定一组唯一整数,返回所有可能的子集。 例如。输入 [1,2,3] 将返回 [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3 ]] 我正在使用回溯解决它:
private List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> getSubsets(int[] nums) {
for (int length = 1; length <= nums.length; length++) { //O(n)
backtrack(nums, 0, new ArrayList<>(), length);
}
result.add(new ArrayList<>());
return result;
}
private void backtrack(int[] nums, int index, List<Integer> listSoFar, int length) {
if (length == 0) {
result.add(listSoFar);
return;
}
for (int i = index; i < nums.length; i++) { // O(n)
List<Integer> temp = new ArrayList<>();
temp.addAll(listSoFar); // O(2^n)
temp.add(nums[i]);
backtrack(nums, i + 1, temp, length - 1);
}
}
代码运行良好,但我无法理解时间/空间复杂度。
我在想的是递归方法被调用了 n 次。在每次调用中,它都会生成最多包含 2^n 个元素的子列表。那么时间和空间,都是O(n x 2^n),对吗?
对吗?如果没有,谁能详细说明?
请注意,我在这里看到了一些答案,例如 this 但无法理解。当递归涉及到图片时,我发现它有点难以理解。
【问题讨论】:
-
如果您期望结果是每个长度 (1-n) 的所有组合,我认为复杂度会类似于 n * n!
-
n^2 会怎样?你能详细说明吗?你是在说时间复杂度还是空间复杂度?
标签: java subset backtracking