90. 子集 II

  1. class Solution {
  2. public List<List<Integer>> subsetsWithDup(int[] nums) {
  3. if (nums == null || nums.length == 0)
  4. return new ArrayList<>();
  5. Arrays.sort(nums);
  6. // 第一次做的时候,排序之后回溯中使用HashSet的特性进行去重
  7. // 这么做虽然简单, 但是效率不高。主要是因为要搜索所有的子集,同时加入结果集合时要检查是否重复
  8. // Set<List<Integer>> ans = new HashSet<>();
  9. // 增加剪枝操作, 直接返回List结果
  10. List<List<Integer>> ans = new ArrayList<>();
  11. List<Integer> currSubSetDup = new ArrayList<>();
  12. dfs(nums, 0, currSubSetDup, ans);
  13. return ans;
  14. }
  15. private void dfs(int[] nums, int index, List<Integer> currSubSetDup, List<List<Integer>> ans) {
  16. ans.add(new ArrayList<>(currSubSetDup));
  17. for (int i = index; i < nums.length; i++) {
  18. if (i > index && nums[i] == nums[i - 1])
  19. continue;
  20. currSubSetDup.add(nums[i]);
  21. dfs(nums, i + 1, currSubSetDup, ans);
  22. currSubSetDup.remove(currSubSetDup.size() - 1);
  23. }
  24. return;
  25. }
  26. }