题目:
题解:
- 先求出所有子集
- 对子集进行唯一性确认,如果已存在就舍弃
public class SubsetsWithDup {
private List<List<Integer>> resultList = new ArrayList<>();
private LinkedList<Integer> pathList = new LinkedList<>();
private Set<String> existSubSet = new HashSet<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
for (int i = 0; i <= nums.length; i++) {
dfsForSubsets(nums, i, 0);
}
return resultList;
}
private void dfsForSubsets(int[] nums, int n, int start) {
if (pathList.size() == n) {
String key = generateUniqueKey(pathList);
if (!existSubSet.contains(key)) {
resultList.add(new ArrayList<>(pathList));
existSubSet.add(key);
}
return;
}
for (int i = start; i < nums.length; i++) {
pathList.add(nums[i]);
dfsForSubsets(nums, n, i+1);
pathList.removeLast();
}
}
private String generateUniqueKey(List<Integer> list) {
return list.stream().sorted().map(String::valueOf).collect(Collectors.joining("-"));
}
}
时间复杂度:O()