Given a set of distinct integers, nums, return all possible subsets.
Note:
Elements in a subset must be in non-descending order.
The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3], a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> r = new ArrayList<List<Integer>>();
r.add(new ArrayList<Integer>());
if (nums == null || nums.length == 0) return r;
Arrays.sort(nums);
for (int i : nums) {
List<List<Integer>> tmp = new ArrayList<List<Integer>>( );
for(List<Integer> t : r){
List<Integer> x = new ArrayList<Integer>(t);
x.add(i);
tmp.add(x);
}
r.addAll(tmp);
}
return r;
}
Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note:
Elements in a subset must be in non-descending order.
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],
[]
]
处理重复数字
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> r = new ArrayList<List<Integer>>();
List<List<Integer>> change = new ArrayList<List<Integer>>(); //记录前一次操作新增的部分
if(nums == null || nums.length == 0) return r;
Arrays.sort(nums);
r.add(new ArrayList<Integer>());
for(int i = 0;i < nums.length;i++){
List<List<Integer>> tmp = new ArrayList<List<Integer>>();
//重复。只改变前一次操作中新增的部分;前一次操作已经存在的部分已经增加过重复的数字了
if(i > 0 && nums[i] == nums[i-1]){
for(List<Integer> t : change){
List<Integer> x = new ArrayList<Integer>(t);
x.add(nums[i]);
tmp.add(x);
}
}
else{
for(List<Integer> t : r){ //没有重复
List<Integer> x = new ArrayList<Integer>(t);
x.add(nums[i]);
tmp.add(x);
}
}
r.addAll(tmp);
change = tmp;
}
return r;
}