题目
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集不能包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
对于getSubsets()方法的循环调用,需要注意一下处于哪一层循环、是谁调用的她。
public static void main(String[] args) {
System.out.println(subsetsWithDup(new int[]{1, 2, 2}));
//[[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]
System.out.println(subsetsWithDup(new int[]{1, 2, 3}));
System.out.println(subsetsWithDup(new int[]{0}));
}
public static List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> subsetsList = new ArrayList<>();
Arrays.sort(nums);
getSubsets(subsetsList, 0, new ArrayList<Integer>(), nums);
return subsetsList;
}
private static void getSubsets(List<List<Integer>> subsetsList, int start, ArrayList<Integer> temp, int[] nums) {
subsetsList.add(new ArrayList<>(temp));
for (int i = start; i < nums.length; i++) {
if (i > start && nums[i] == nums[i - 1]) {
continue;
}
temp.add(nums[i]);
getSubsets(subsetsList, i + 1, temp, nums);
temp.remove(temp.size() - 1);
}
}
勉强说得过去