题目描述(传送门)
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
思考
这道题与之前子集不同的是有了重复元素。
算法思路
解题思路&代码解析
我们只需要对昨天代码做两部改进:
- 对原始数组进行排序
- 对子集借助Set去重
【小象算法Java版】第一节:链表(上)
这里边我们求解相交链表也是用到Set可以参考。
package com.wenhui.lession4;
import java.util.*;
/**
* @ClassName leetcode90
* @Description :TODO
* @Author Josvin
* @Date 2021/02/07/22:36
*/
public class leetcode90 {
public static List<List<Integer>> subsets(int[] nums) {
List<Integer> list = new ArrayList<>();
List<List<Integer>> listList = new ArrayList<>();
Arrays.sort(nums);
Set<List<Integer>> set = new HashSet<>();
set.add(list);
listList.add(list);
subsetsHelper(0, nums, list, listList,set);
return listList;
}
private static void subsetsHelper(int i, int[] nums, List<Integer> list, List<List<Integer>> listList, Set<List<Integer>> set) {
if (i >= nums.length) {
return;
}
list.add(nums[i]);
if (!set.contains(new ArrayList<>(list))) {
listList.add(new ArrayList<>());
set.add(new ArrayList<>(list));//
}
subsetsHelper(i + 1, nums, list,listList, set);
list.remove(list.size() - 1);
subsetsHelper(i + 1, nums, list, listList,set);
}
}