【发布时间】:2023-02-21 13:38:43
【问题描述】:
我想在leetcode上验证我解决subsets问题的空间和时间复杂度。由于堆栈空间,空间复杂度为 O(N)。时间复杂度为 O(2^N),因为每个第 i 层的工作是向列表中添加 2^i 个元素。所以从 0 到 N 对 2^i 求和得到 O(2^N)。我对么?我不确定,因为 3 个官方解决方案的时间复杂度为 O(N*2^N)。
import java.util.ArrayList;
import java.util.List;
public class Solution {
// Space Complexity: O(N)
// Time Complexity: 2^0 + 2^1 + ... + 2^N = O(2^N)
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> subsets = new ArrayList<>();
subsets.add(List.of());
subsetsHelper(nums, 0, subsets);
return subsets;
}
private void subsetsHelper(int[] nums, int index, List<List<Integer>> subsets) {
if (index >= nums.length) return;
int current = nums[index];
int initialSize = subsets.size();
for (int i = 0; i < initialSize; i++) {
var list = subsets.get(i);
var listCopy = new ArrayList<>(list);
listCopy.add(current);
subsets.add(listCopy);
}
subsetsHelper(nums, index + 1, subsets);
}
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.subsets(new int[]{0, 1, 2}));
}
}
【问题讨论】: