解题思路:
和subsets I相比多了一个start位置的设置。
对于[1,2,2]
有初始子集合:[] [1]
对于nums[1]=2,由于nums[1]!=nums[0],故从0位开始叠加2并加入到结果中,可得:
[] [1] [2] [1,2]
对于nums[2]=2,由于nums[2]=nums[1],故start=2即[2]开始叠加,可以得到:
[] [1] [2] [1,2] [2,2] [1,2,2]
主要还是维护这个start
提交代码:
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> ans=new ArrayList<List<Integer>>();
List<Integer> base=new ArrayList<Integer>();
List<Integer> tmp=new ArrayList<Integer>();
tmp.addAll(base);
ans.add(tmp);
if(nums.length==0) return ans;
Arrays.sort(nums);
base.add(nums[0]);
tmp=new ArrayList<Integer>();
tmp.addAll(base);
ans.add(tmp);
base.remove((Integer)nums[0]);
int start=1;
for(int i=1;i<nums.length;i++) {
start=addSubSet(i,nums,start,ans);
}
return ans;
}
public int addSubSet(int p,int[] nums,int start,
List<List<Integer>> ans) {
int size=ans.size();
if(nums[p]==nums[p-1]) {
for(int i=start;i<size;i++) {
List<Integer> tmp=new ArrayList<Integer>();
tmp.addAll(ans.get(i));
tmp.add(nums[p]);
ans.add(tmp);
//System.out.println(ans);
}
}else {
for(int i=0;i<size;i++) {
List<Integer> tmp=new ArrayList<Integer>();
tmp.addAll(ans.get(i));
tmp.add(nums[p]);
ans.add(tmp);
// System.out.println(ans);
}
}
return size;
}
}
运行结果: