首页 > 技术文章 > 90.Subsets II

cing 2017-11-22 21:13 原文

题目链接: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     }
View Code

法二:并没有剪枝,而是在计算完所有的集合后,与结果集进行判断,如果结果集中没有,则加入结果集,否则跳过。代码如下(耗时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     }
View Code

 

推荐阅读