Q:现在有一个没有重复元素的整数集合S,求S的所有子集
注意:
- 你给出的子集中的元素必须按非递增的顺序排列
- 给出的解集中不能出现重复的元素
例如:
如果S=[1,2,3], 给出的解集应为:
[↵ [3],↵ [1],↵ [2],↵ [1,2,3],↵ [1,3],↵ [2,3],↵ [1,2],↵ []↵]
A:
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
public ArrayList<ArrayList<Integer>> subsets(int[] nums) {
if (nums.length == 0)
return res;
//保证非递增
Arrays.sort(nums);
ArrayList<Integer> array = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
//i是这次需要的数量
DFS(array, i, 0, nums);
}
return res;
}
private void DFS(ArrayList<Integer> array, int count, int start, int[] nums) {
if (count < 0)
return;
else if (count == 0)
res.add(new ArrayList<>(array));
else {
for (int i = start; i < nums.length; i++) {
array.add(nums[i]);
//从当前的下一个开始,count的数量减一,开始的地方加一
DFS(array, count - 1, i + 1, nums);
array.remove(array.size() - 1);
}
}
}
Q:给出一个可能包含重复元素的整数集合S,返回该整数集合的所有子集。
注意:
- 你给出的子集中的元素要按非递增的顺序排列
- 给出的解集中不能包含重复的子集
例如:
如果S =[1,2,2], 给出的解集应该是:
[↵ [2],↵ [1],↵ [1,2,2],↵ [2,2],↵ [1,2],↵ []↵]
A:比上一个多加一个判断条件
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
public ArrayList<ArrayList<Integer>> subsets(int[] nums) {
if (nums.length == 0)
return res;
Arrays.sort(nums);
ArrayList<Integer> array = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
DFS(array, i, 0, nums);
}
return res;
}
private void DFS(ArrayList<Integer> array, int count, int start, int[] nums) {
if (count < 0)
return;
else if (count == 0)
res.add(new ArrayList<>(array));
else {
for (int i = start; i < nums.length; i++) {
if (i > start && nums[i] == nums[i - 1])
continue;
array.add(nums[i]);
DFS(array, count - 1, i + 1, nums);
array.remove(array.size() - 1);
}
}
}