您的位置:首页 > 其它

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