Leetcode 子集II

子集II

题目描述:

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。

题目链接

class Solution {
    
    
    private int[] nums;
    private int len;
    private List<List<Integer>> result;
    private List<Integer> temp;
    public List<List<Integer>> subsetsWithDup(int[] nums) {
    
    
        // 初始化
        this.nums = nums;
        this.len = nums.length;
        this.result = new ArrayList<List<Integer>>();
        this.temp = new ArrayList<Integer>();
        Arrays.sort(nums); // 去重关键1
        DFS(0);
        return result;
    }
    private void DFS(int begin){
    
    
        this.result.add(new ArrayList<Integer>(this.temp));
        
        for(int i = begin ; i<len ; i++){
    
    
            if(i != begin && nums[i-1] == nums[i]) continue; // 去重关键2
            // 选择该下标元素
            temp.add(nums[i]);
            DFS(i+1);
            // 不选择该下标元素
            temp.remove(temp.size()-1);
        }
    }
}

该题的主要难点就是如何去重,这里去重思路首先是需要排序,然后在该层处理相邻相等元素使用上只会出现一次,至于这里没有显示地出现递归结束条件,是因为该题就是求解子集的问题,即不需要增加长度限制条件,这个for循环就是一个递归结束条件。详细请看代码,有疑问欢迎留言。

猜你喜欢

转载自blog.csdn.net/weixin_43914658/article/details/114146355