题目链接:LeetCode90
欢迎留言交流,每天都会回消息。
可以先看子集,本题思路是最笨的一种方法,将子集中的结果进行了去重和排序。
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();}}
}