题目链接

题目大意:给出一个集合,例如[1,2,2],要求输出该集合的所有不重复子集合,即:[ [2], [1], [1,2,2], [2,2], [1,2], [] ]

这道题使用DFS进行深度优先遍历,看视频用的是大神的代码,特别是中间对于重复的集合的处理确实很巧妙,上代码:

 1 public class Solution {
 2     public static List<List<Integer>> ans = new ArrayList<List<Integer>>();
 3     
 4     public static boolean[] v = new boolean[100];
 5     
 6     //[2,2,2,2,2] 连续
 7     //1表示取  0表示不可取
 8     //[1,0][1,1,0,0]合法
 9     //[1,1,1][0,0,0]合法
10     //[0,1]不合法
11     //也就是说  连续的数字  首位不取得情况  要排除
12     
13     public void robot(int idx, int[] nums){
14         if(idx >= nums.length){
15             List<Integer> tmp = new ArrayList<Integer>();
16             for (int i=0; i<nums.length; i++)
17             {
18                 if (v[i])
19                 {
20                     tmp.add(nums[i]);
21                     
22                 }
23             }
24             ans.add(tmp);
25             return ;
26         }
27         if (idx > 0 && nums[idx - 1] == nums[idx] && v[idx - 1] == false){
28             v[idx] = false;
29             robot(idx+1, nums);
30         }else{
31             v[idx] = true;
32             robot(idx+1, nums);
33             
34             v[idx] = false;
35             robot(idx+1, nums);
36         }
37         
38     }
39     
40     public List<List<Integer>> subsetsWithDup(int[] nums) {
41         ans.clear();
42         int n = nums.length;
43         for(int i=0; i<n; i++){
44             for(int j=i+1; j<n; j++)
45             {
46                 if (nums[i] > nums[j])
47                 {
48                     int tmp;
49                     tmp = nums[i];
50                     nums[i] = nums[j];
51                     nums[j] = tmp;
52                 }
53             }
54         }
55         robot(0, nums);
56         return ans;
57     }
58 }

 


posted on 2017-03-23 16:10  pangzp  阅读(118)  评论(0编辑  收藏  举报