Leetcode 90. Subsets II

Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,2], a solution is:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]

题意:给出一个数组,数组中可能包含重复元素,求这个数组的所有不重复子集。

思路:这道题是subsets的followup,增加的条件是数组中会出现重复元素,但是返回的子集不能允许重复。比如[1,2,2],1和两个2都可以组成子集,但是只能返回一个,所以关键在于遇到重复元素时的处理。既然选哪个2和1组成的子集都一样,我们就可以定下一个规则,对于所有重复元素,我们只选择第一次出现的那个。另外,题目没有说明数组已排序,所以别忘了先排序,再搜索。

public List<List<Integer>> subsetsWithDup(int[] nums) {
    List<List<Integer>> res = new ArrayList<>();
    if (nums == null || nums.length == 0) {
        return res;
    }

    Arrays.sort(nums);
    dfs(nums, 0, new ArrayList<>(), res);

    return res;
}

private void dfs(int[] nums, int start, List<Integer> subres, List<List<Integer>> res) {
    res.add(new ArrayList<>(subres));

    for (int i = start; i < nums.length; i++) {
        //遇到重复元素,并且自己不是第一个就不选了
        if (i > start && nums[i] == nums[i-1]) {
            continue;
        }

        subres.add(nums[i]);
        dfs(nums, i + 1, subres, res);
        subres.remove(subres.size() - 1);
    }
}
    原文作者:ShutLove
    原文地址: https://www.jianshu.com/p/707313bc5108
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞