子集 II(力扣第91题)

题目:

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

  说明:解集不能包含重复的子集。

示例:

输入: [1,2,2]
输出:
[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

分析:

  需要注意的就是给定的数组中存在重复的元素,然后要求找出的所有子集都是唯一的,不能含有重复的子集。由于数组中可能存在重复的元素,所以可能会造成求出的子集重复,因为集合是无序的,只要含有的元素相同那就是相同的集合,所以为了达到去重的目的,先对给定的数组nums进行一个排序,然后再进行搜索,这就保证了值小的元素不会出现在值大的元素的搜索路径的后面,避免了无序可能造成的子集重复。

实现代码如下:

public List<List<Integer>> subsetsWithDup(int[] nums) {

        if(nums.length == 0 || nums == null){
            return new ArrayList<>();
        }
        resList = new ArrayList<>();
        resList.add(new ArrayList<>());
        Arrays.sort(nums);
        List<Integer> curlist = new ArrayList<>();

        findsubsets(curlist,0,nums);

        return resList;
    }
    int lastnum = Integer.MIN_VALUE;
    private void findsubsets(List<Integer> curlist,int s,int[] nums){

        if (curlist.size() == nums.length){

            return;
        }

        for (int i = s; i < nums.length; i++) {

            if (nums[i] != lastnum){
                curlist.add(nums[i]);
                resList.add(new ArrayList<>(curlist));
                findsubsets(curlist,i+1,nums);
                lastnum = curlist.get(curlist.size()-1);
                curlist.remove(curlist.size()-1);
            }

        }
    }

 

posted @ 2020-07-22 21:56  有心有梦  阅读(156)  评论(0编辑  收藏  举报