Problem: 78. 子集
题目描述
思路及解法
1.定义一维数组track用于记录决策路径,二维数组res用于存储所有的子集;
2.决策阶段:从0阶段起来(0阶段决策路径中为空集),每次将当前阶段的决策路径添加到res中;为了保证元素的不重复我们要保证原始数组nums中元素的相对顺序,则在利用回溯模板解题时我们每次使得循环中的索引起始位置从当前的决策阶段开始
复杂度
时间复杂度:
O ( N × 2 N ) O(N \times 2^N) O(N×2N);其中 N N N为数组nums的长度
空间复杂度:
O ( N ) O(N) O(N)
Code
class Solution {
// Recode the result
private List<List<Integer>> res = new ArrayList<>();
// Recode the Decision path
private List<Integer> track = new ArrayList<>();
/**
* Subset
*
* @param nums Universe
* @return List<List < Integer>>
*/
public List<List<Integer>> subsets(int[] nums) {
backtrack(nums, 0);
return res;
}
/**
* Backtracking function
*
* @param nums Universe
* @param start Decision stage
*/
private void backtrack(int[] nums, int start) {
res.add(new ArrayList<>(track));
for (int i = start; i < nums.length; ++i) {
track.add(nums[i]);
backtrack(nums, i + 1);
track.remove(track.size() - 1);
}
}
}