【leetcode】78. 子集

在这里插入图片描述

用动态规划:

在这里插入图片描述

/**
 * @Auther: Mason
 * @Date: 2020/09/20/8:13
 * @Description:
 */
/*
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。
用动态规划的方法进行解题。
 */
class Solution {
    
    
    public static void main(String[] args) {
    
    
        Solution s = new Solution();
        System.out.println(s.subsets(new int[]{
    
    1, 2, 3}));
    }

    public List<List<Integer>> subsets(int[] nums) {
    
    
        List<List<Integer>> res = new LinkedList<>();
        LinkedList<Integer> tmp = new LinkedList<>();
        res.add(tmp);
        dp(nums, 0, res, nums.length);
        return res;
    }

    // 遍历到第i个元素,数字为x。  那么增加了:x,x和前边每一个搭配。
    private void dp(int[] nums, int i, List<List<Integer>> res, int len) {
    
    
        if(i==len) return;
        int x = nums[i];
        int size = res.size();
        for (int j = 0; j < size; j++) {
    
    
            List<Integer> tmp = res.get(j);
            LinkedList<Integer> newList = new LinkedList<>(tmp);
            newList.add(x);
            res.add(newList);
        }
        dp(nums,i+1,res,len);
    }
}

用深度优先遍历,搜索回溯

class Solution {
    
    
    List<List<Integer>> res = new LinkedList<>();
    List<Integer> tmp = new LinkedList<>();

    public List<List<Integer>> subsets(int[] nums) {
    
    
        dfs(nums, 0);
        return res;
    }

    private void dfs(int[] nums, int i) {
    
    
        if (i == nums.length) {
    
    
            res.add(new LinkedList<>(tmp));
            return;
        }

        // 不要这个位置的数字
        dfs(nums, i + 1);
        // 要这个位置的数字。
        tmp.add(nums[i]);
        dfs(nums, i + 1);
        tmp.remove(tmp.size() - 1);
    }

}

猜你喜欢

转载自blog.csdn.net/Mason97/article/details/108689106