LeetCode 78-子集Ⅱ

时间:2024-11-14 07:56:13
class Solution { //存储返回结果的集合 List<List<Integer>> rs = new ArrayList<>(); //存储子集的临时数组 LinkedList<Integer> path = new LinkedList<>(); public List<List<Integer>> subsetsWithDup(int[] nums) { backTracking(nums, 0); //去重复操作 List<List<Integer>> rs1 = new ArrayList<>(); for(List<Integer> list: rs){ //对集合中的每一个子集进行排序,为后续去重复做基础 Collections.sort(list); //去重复操作 if(!rs1.contains(list)){ rs1.add(list); } } return rs1; } void backTracking(int[] nums, int startIdx){ //和其他的递归不同,这里不是将递归中叶子节点的元素加入最终集合中,这里时将每个节点的结果都加入到结果集合中 rs.add(new ArrayList<>(path)); //终止条件 if(startIdx >= nums.length){ return; } for(int i = startIdx; i < nums.length; i++){ //添加单个元素到子集中 path.add(nums[i]); //递归 backTracking(nums, i + 1); //回溯 path.removeLast(); } } }