一文搞懂全排列、组合、子集问题 (4)

实现的代码为:

class Solution { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> valueList=new ArrayList<List<Integer>>(); boolean jud[]=new boolean[nums.length]; List<Integer>team=new ArrayList<Integer>(); dfs(nums,-1,valueList,jud); return valueList; } private void dfs(int[] num,int index,List<List<Integer>> valueList,boolean jud[]) { {//每进行递归函数都要加入到结果中 List<Integer>list=new ArrayList<Integer>(); for(int i=0;i<num.length;i++) { if (jud[i]) { list.add(num[i]); } } valueList.add(list); } { for(int i=index+1;i<num.length;i++) { jud[i]=true; dfs(num, i, valueList,jud); jud[i]=false; } } } } 有重复数组子集

题目描述(力扣90题):

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]

和上面无重复数组求子集不同的是这里面可能会出现重复的元素。我们需要在结果中过滤掉重复的元素。

首先,子集问题无疑是使用回溯法求得结果,首先分析如果序列没有重复的情况,我们会借助一个boolean[]数组标记使用过的元素和index表示当前的下标,在进行回溯的时候我们只向后进行递归并且将枚举到的那个元素boolean[index]置为true(回来的时候复原)。每次递归收集boolean[]数组中true的元素为其中一个子集。

在这里插入图片描述


而有重复元素的处理上,和前面全排列的处理很相似,首先进行排序,然后在进行递归处理的时候遇到相同元素只允许从第一位连续使用而不允许跳着使用,所以在递归向下时候需要判断是否满足条件(第一个元素和前一个不同或和前一个同且前一个已使用),具体可以参考这张图:

image-20210129161710230

实现代码为:

class Solution { public List<List<Integer>> subsetsWithDup(int[] nums) { Arrays.sort(nums); boolean jud[]=new boolean[nums.length]; List<List<Integer>> valueList=new ArrayList<List<Integer>>(); dfs(nums,-1,valueList,jud); return valueList; } private void dfs(int[] nums, int index, List<List<Integer>> valueList, boolean[] jud) { // TODO Auto-generated method stub List<Integer>list=new ArrayList<Integer>(); for(int i=0;i<nums.length;i++) { if (jud[i]) { list.add(nums[i]); } } valueList.add(list); for(int i=index+1;i<nums.length;i++) {//第一个元素 或 当前元素不和前面相同 或者相同且前面被使用了可以继续进行 if((i==0)||(nums[i]!=nums[i-1])||(i>0&&jud[i-1]&&nums[i]==nums[i-1])) { jud[i]=true; dfs(nums, i, valueList,jud); jud[i]=false; } } } } 结语

到这里,本篇的全排列、组合、子集问题就介绍到这里啦,尤其要注意问题处理去重的思路和策略。当然和这类似的问题也是很多啦,多刷一刷就可以很好的掌握,后面敬请期待!

咱们下次再见!关注后欢迎加入力扣打卡群(备注力扣 即可)。

image-20201114211553660

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwzwy.html