【DFS】LeetCode 78. 子集

题目链接

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();
        }
    }
}
posted @ 2023-03-06 10:50  Frodo1124  阅读(22)  评论(0编辑  收藏  举报