DFS和回溯专题:子集
题目链接: 78.子集
题目描述
代码思路
因为题目要求的是数组所有可能的子集,所以通过回溯遍历出来的所有结果都可以添加到结果列表中,代码直接套用回溯模版即可。
代码纯享版
class Solution {
public List<List<Integer>> list_all = new ArrayList();
public List<Integer> list = new ArrayList();
public List<List<Integer>> subsets(int[] nums) {
backtrack(nums, 0);
return list_all;
}
void backtrack(int[] nums, int start){
list_all.add(new ArrayList(list));
for(int i = start; i < nums.length; i++){
list.add(nums[i]);
backtrack(nums, i + 1);
list.remove(list.size() - 1);
}
}
}
代码逐行解析版
class Solution {
public List<List<Integer>> list_all = new ArrayList();
public List<Integer> list = new ArrayList();
public List<List<Integer>> subsets(int[] nums) {
backtrack(nums, 0);
return list_all;
}
void backtrack(int[] nums, int start){
//题目要求所有子集,无需任何条件,直接将列表list添加到list_all
list_all.add(new ArrayList(list));
for(int i = start; i < nums.length; i++){
list.add(nums[i]); //将元素添加到list列表
backtrack(nums, i + 1); // 进入下一层的元素添加,start=i+1
list.remove(list.size() - 1); //回溯,删掉列表最后一个元素
}
}
}