Leetcode 90 Subsets II (打印不重复的子集)
2016-11-01 18:58
465 查看
一,问题描述:
1,给定一个整数集合(集合元素具有相异性),求出所有的不重复的子集合。并且子集里<1,2>和<2,1>属于重复了的2,例如:
nums=[1,2,2]
输出:
[]
[2]
[1]
[1,2,2]
[2,2]
[1,2]
3,解题思路:
这题和第78题的思路一样的(在我的博客里有第78题的解),首先对集合进行排序,使用sort(nums),然后和78题的方法一样(使用位操作的方法)。,把一个集合中所有的子集给计算出来,然后把子集转化成字符串,存放在Set集合里,因为Set集合里面可以去除重复的字符串。然后在对Set集合中的每个字符串转化成int数据,存放在List里面。值得注意的就是Set里面的空字符是无法转换成int类型的,所以遇到空字符直接存入到List集合中去。
二,AC了的程序(用java实现的)
import java.util.*; public class Test2{ public List<List<Integer>> subsetsWithDup(int []nums) { List<List<Integer>> list=new ArrayList<List<Integer>>(); Set<String> set=new HashSet<String>(); //直接使用Set来,使得Set里面的字符串没有一个重复的。 if(nums==null||nums.length==0) { return list; } Arrays.sort(nums); //首先对数组nums进行排序,从小到大排序。 int n=nums.length; //数组的长度 int num=(int)Math.pow(2,n); for(int i=0;i<num;i++) //这里是2^n次的 { int index=1; StringBuffer sb=new StringBuffer(); //字符串 for(int j=0;j<n;j++) //数组的长度 { int data=i&index; //一共要计算num*n次的位与操作 if(data>0) { //temp.add(nums[j]); sb.append(String.valueOf(nums[j])); sb.append(" ");//每次增加了一个字符串后,后面再加一个空字符 例如: 11 12 13这样形式 } index=index<<1;//左乘2的1次方 } set.add(sb.toString()); } Iterator<String> it=set.iterator(); while(it.hasNext()) { String str=it.next(); String []strarray=str.split(" ");//遇到空字符的时候,直接分割 int len=strarray.length; //字符串个数。 List<Integer> temp=new ArrayList<Integer>(); for(int i=0;i<len;i++) { String str1=strarray[i]; if(str1.equals("")) //这里考虑到了空字符,空集无法转换成数字的,所以遇到空集,直接在list.add(null)这样就可以了 { } else //遇到非空集合,直接把数字字符串转化成整数 使用Integer.parseInt(). { int data=Integer.parseInt(str1); temp.add(data); } } list.add(temp); } return list; } public static void main(String []args) { Test2 test=new Test2(); Scanner scan=new Scanner(System.in); int n=scan.nextInt(); int []data=new int ; for(int i=0;i<n;i++) { data[i]=scan.nextInt(); } List<List<Integer>> list1=test.subsetsWithDup(data); System.out.println("不重复的子集: "); Iterator<List<Integer>> it1=list1.iterator(); while(it1.hasNext()) { List<Integer> list2=it1.next(); Iterator<Integer> it2=list2.iterator(); while(it2.hasNext()) { int result=it2.next(); System.out.print(result+" "); } System.out.println(); } } }
运行结果:
三,总结
1,这题要和第78题,结合起来思考的,可以借鉴第78题的位操作解法,然后再去除重复的字符串。
相关文章推荐
- Leetcode 78 Subsets + 90 Subsets II 子集
- LeetCode-Subsets II-可重复子集和-DFS
- [LeetCode]—Subsets II 求数组子集(有重复值)
- LeetCode | Subsets II(带有重复数据的数组的子集)
- Subsets II [leetcode] 从获取子集的递归和循环方法说起,解决重复子集的问题
- Leetcode 90 Subsets II
- Leetcode#90 Subsets II
- LeetCode 90. Subsets II
- LeetCode(90) Subsets II
- LeetCode90 Subsets II
- [leetcode 90] Subsets II
- LeetCode 90: Subsets II
- [LeetCode 90] Subsets II
- leetcode90:Subsets II
- Array-----90. Subsets II(求数组的子集)
- leetcode 90 Subsets II
- leetcode(90):Subsets II
- 【LeetCode】C# 90、Subsets II
- [LeetCode 78] Subsets && [LeetCode 90] Subsets II
- Leetcode 78 Subsets(打印全部子集)