90.Subsets II
题目链接:https://leetcode.com/problems/subsets-ii/description/
题目大意:与78题一样,只是这里给出的数组中有重复数字。
法一(借鉴):利用78题的法一,进行与47题类似的剪枝去重操作。也就是排序,判断前一个元素等。代码如下(耗时4ms):
1 public List<List<Integer>> subsetsWithDup(int[] nums) { 2 List<List<Integer>> list = new ArrayList<List<Integer>>(); 3 List<Integer> tmp = new ArrayList<Integer>(); 4 Arrays.sort(nums); 5 dfs(list, tmp, nums, 0); 6 return list; 7 } 8 public static void dfs(List<List<Integer>> list, List<Integer> tmp, int[] nums, int start) { 9 list.add(new ArrayList<Integer>(tmp)); 10 for(int i = start; i < nums.length; i++) { 11 //剪枝,这里i!=start还没怎么看懂,但是不能使用i>0的判断 12 if(i != start && nums[i] == nums[i - 1]) { 13 continue; 14 } 15 tmp.add(nums[i]); 16 dfs(list, tmp, nums, i + 1); 17 tmp.remove(tmp.size() - 1); 18 19 } 20 }
法二:并没有剪枝,而是在计算完所有的集合后,与结果集进行判断,如果结果集中没有,则加入结果集,否则跳过。代码如下(耗时61ms):
1 public List<List<Integer>> subsetsWithDup(int[] nums) { 2 List<List<Integer>> list = new ArrayList<List<Integer>>(); 3 List<Integer> tmp = new ArrayList<Integer>(); 4 Arrays.sort(nums); 5 dfs(list, tmp, nums, 0); 6 return list; 7 } 8 public static void dfs(List<List<Integer>> list, List<Integer> tmp, int[] nums, int start) { 9 if(!list.contains(tmp)) {//与结果集进行判断 10 list.add(new ArrayList<Integer>(tmp)); 11 } 12 for(int i = start; i < nums.length; i++) { 13 tmp.add(nums[i]); 14 dfs(list, tmp, nums, i + 1); 15 tmp.remove(tmp.size() - 1); 16 } 17 }