回溯算法之子集问题
一、回溯算法简介
二、回溯算法与树的遍历
三、子集问题
3.1 子集问题简介
3.2 子集问题的回溯树

3.2.1 二叉树形式结构解释
3.2.2 普通树形式结构解释
四、子集问题具体代码实现
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
backTrace2(nums, 0, res, new ArrayList<>());
return res;
}
public void backTrace1(int[] nums,
int startIndex,
List<List<Integer>> res,
List<Integer> curSubSet) {
res.add(new ArrayList<>(curSubSet));
if (startIndex >= nums.length) {
return;
}
for (int i = startIndex; i < nums.length; i++) {
curSubSet.add(nums[i]);
backTrace1(nums, i + 1, res, curSubSet);
curSubSet.remove(curSubSet.size() - 1);
}
}
public void backTrace2(int[] nums,
int startIndex,
List<List<Integer>> res,
List<Integer> curSubSet) {
if (startIndex >= nums.length) {
res.add(new ArrayList<>(curSubSet));
return;
}
curSubSet.add(nums[startIndex]);
backTrace2(nums, startIndex + 1, res, curSubSet);
curSubSet.remove(curSubSet.size() - 1);
backTrace2(nums, startIndex + 1, res, curSubSet);
}
public static void main(String[] args) {
int[] nums = {1, 2, 3};
System.out.println(new Solution().subsets(nums));
}
}