90.Subsets II

題目連接:https://leetcode.com/problems/subsets-ii/description/數組

題目大意:與78題同樣,只是這裏給出的數組中有重複數字。ide

法一(借鑑):利用78題的法一,進行與47題相似的剪枝去重操做。也就是排序,判斷前一個元素等。代碼以下(耗時4ms):spa

 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):code

 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
相關文章
相關標籤/搜索