LeetCode #90 Subsets II

题目链接

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

 

 

转载于:https://www.cnblogs.com/pang-zp/p/6605684.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值