【DFS】LeetCode 78. 子集
题目链接
思路
求子集问题和 77.组合 (opens new window) 和 131.分割回文串 (opens new window) 又不一样了。
如果把子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!
其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。
那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始!
有同学问了,什么时候for可以从0开始呢?
求排列问题的时候,就要从0开始,因为集合是有序的,{1, 2} 和{2, 1}是两个集合。
引用自代码随想录
代码
class Solution {
private List<List<Integer>> result = new ArrayList<>();
private Deque<Integer> path = new ArrayDeque<>();
public List<List<Integer>> subsets(int[] nums) {
Arrays.sort(nums);
dfs(0, nums);
return result;
}
void dfs(int index, int[] nums){
result.add(new ArrayList<>(path));
if(index >= nums.length){
return;
}
for(int i = index; i < nums.length; i++){
path.add(nums[i]);
dfs(i + 1, nums);
path.removeLast();
}
}
}