题目原型:
Given a collection of integers that might contain duplicates, S, return all possible subsets.
Note:
For example,
If S = [1,2,2], a solution is:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
基本思路:
这个题在上一个的基础上增加了重复数字。那么怎么处理这些重复数字呢?我们先定义一个插入点,即每次递归返回到上一层时需要从哪个集合开始插入num[index].分两种情况:
1、当此时的num[index]!=num[index+1]时,我们从集合的第一个元素开始插入。
2、当num[index]==num[index+1]时,我们就要注意插入位置了。此时又分两种情况。
1.如果说insertNum为0,也就是说一开始就是相同的数字如数组[2,2] 那么在最后一个元素插入即可。2的subset是[],2,那么[2,2]的subset是[],2,22,也就是从2开始插入的;
2.如果说不为0,那么就是从tmp.size()-insertNum开始插入。如[1,2,2],2的subset是[],2,那么[1,2]的subset是[],2,1,12.此时记录insertNum为[1,2]的长度也就是2.那么[1,1,2]的subset在[1,2]的基础上从tmp.size()-insertNum开始插入,即在[1,2]的基础上增加11,112。最后的结果是[],2,1,12,11,112。
int insertNum = 0;//需要插入num[index]的集合数目
public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num)
{
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
if(num==null||num.length==0)
return list;
Arrays.sort(num);
return getSubsets(num, 0);
}
public ArrayList<ArrayList<Integer>> getSubsets(int[] num , int index)
{
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
if(index==num.length-1)
{
list.add(new ArrayList<Integer>());
ArrayList<Integer> number = new ArrayList<Integer>();
number.add(num[index]);
list.add(number);
return list;
}
else
{
ArrayList<ArrayList<Integer>> tmp = getSubsets(num, index+1);
ArrayList<Integer> tmpnum ;
for(int i = 0;i<tmp.size();i++)
{
list.add(tmp.get(i));
}
for(int i = 0;i<tmp.size();i++)
{
if(num[index]==num[index+1])
{
//开始插入点分两种情况
//1.如果说insertNum为0,也就是说一开始就是相同的数字如数组[2,2] 那么在最后一个元素插入即可。2的subset是[],2,那么[2,2]的subset是[],2,22,也就是从2开始插入的
//2.如果说不为0,那么就是从tmp.size()-insertNum开始插入。如[1,2,2],2的subset是[],2,那么[1,2]的subset是[],2,1,12.此时记录insertNum为[1,2]的长度也就是2.那么[1,1,2]的
//subset在[1,2]的基础上从tmp.size()-insertNum开始插入,即在[1,2]的基础上增加11,112。最后的结果是[],2,1,12,11,112
int startIndex = insertNum==0?tmp.size()-1:tmp.size()-insertNum;
if(i>=startIndex)
{
tmpnum = new ArrayList<Integer>(tmp.get(i));
tmpnum.add(0, num[index]);
list.add(tmpnum);
}
}
else
{
insertNum = tmp.size();
tmpnum = new ArrayList<Integer>(tmp.get(i));
tmpnum.add(0, num[index]);
list.add(tmpnum);
}
}
return list;
}
}
原文:http://blog.csdn.net/cow__sky/article/details/21949923