题目大意:给出一个集合,例如[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 }