78.子集
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> subsets(int[] nums) {
if(nums.length == 0){
res.add(new ArrayList<>());
return res;
}
backtrack(nums,0);
return res;
}
public void backtrack(int[] nums,int startIndex){
res.add(new ArrayList<>(path));
if(startIndex >= nums.length){ //终止条件
return;
}
for(int i = startIndex; i < nums.length; i++){ //选择路径
path.add(nums[i]); //做选择
backtrack(nums,i+1); //递归进入下一层
path.removeLast(); //撤销选择
}
}
}
90.子集||
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
boolean[] used;
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
used = new boolean[nums.length];
if(nums.length == 0){
res.add(new ArrayList<>());
return res;
}
backtrack(nums,0);
return res;
}
private void backtrack(int[] nums,int startIndex){
res.add(new ArrayList<>(path));
if(startIndex >= nums.length){
return;
}
for(int i = startIndex;i < nums.length;i++){
if(i>0 && nums[i] == nums[i-1] && !used[i-1]){ //还有i>0
continue;
}
path.add(nums[i]); //选择
used[i] = true; //标记
backtrack(nums,i