您的位置:首页 > 其它

90. Subsets II

2016-07-20 09:45 363 查看
Given a collection of integers that might contain duplicates, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example,

If nums = 
[1,2,2]
,
a solution is:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]


二进制法生成所有子集合,hash去重,生成方法优,去重耗费大量时间,是下策
public class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums)
{
int len=nums.length;
List<List<Integer>> retlist=new ArrayList<>(1<<len);
HashSet<ArrayList<Integer>> hashset=new HashSet<>(256);
Arrays.sort(nums);

for(int i=0;i<1<<len;i++)
{
ArrayList<Integer> arraylist=new ArrayList<>(len);
for(int j=0;j<len;j++)
if((i&(1<<j))!=0)
arraylist.add(nums[j]);

if(!hashset.contains(arraylist))
{
retlist.add(arraylist);
hashset.add(arraylist);
}
}
return retlist;
}
}

回溯法,设nums长度为n,搜索深度依次从0到n,先排序从上次搜索下个位置开始搜,相同的元素捆绑处理。
public class Solution {
List<List<Integer>> retlist=new ArrayList<>(256);
ArrayList<Integer> arraylist;
public List<List<Integer>> subsetsWithDup(int[] nums)
{
int len=nums.length;
arraylist=new ArrayList<>(512);
Arrays.sort(nums);
for(int i=0;i<=len;i++)
dfs(i, 0, -1, nums);

return retlist;
}

public void dfs(int target,int deep,int lastindex,int[] nums)
{
if(deep==target)
{
retlist.add(new ArrayList<>(arraylist));
return ;
}

for(int i=lastindex+1;i<nums.length;i++)
{
if(i>0&&nums[i]==nums[i-1])
if(lastindex!=i-1)
continue;

arraylist.add(nums[i]);
dfs(target, deep+1, i, nums);
arraylist.remove(arraylist.size()-1);
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: