DFS与回溯专题:子集 II
题目链接: 90.子集 II
参考题解: 代码随想录
题目描述
代码思路
套用回溯的模版,同时要进行剪枝,在同一层中遇到多个相同的元素,使用第一个后跳过后面相同的元素
代码纯享版
class Solution {
public List<List<Integer>> list_all = new ArrayList();
public List<Integer> list = new ArrayList();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
backtrack(nums, 0);
return list_all;
}
void backtrack(int[] nums, int start){
list_all.add(new ArrayList(list));
for(int i = start; i < nums.length; i++){
if(i > start && nums[i] == nums[i - 1]){
continue;
}
list.add(nums[i]);
backtrack(nums, i + 1);
list.remove(list.size() - 1);
}
}
}
代码逐行解析版
class Solution {
public List<List<Integer>> list_all = new ArrayList();
public List<Integer> list = new ArrayList();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums); //对数组进行排序
backtrack(nums, 0);
return list_all;
}
void backtrack(int[] nums, int start){
list_all.add(new ArrayList(list)); //将list添加到list_all
for(int i = start; i < nums.length; i++){
if(i > start && nums[i] == nums[i - 1]){ //当前层跳过重复的元素
continue;
}
list.add(nums[i]); //将数组元素添加到list中
backtrack(nums, i + 1); //递归到下一层,start=i+1
list.remove(list.size() - 1); //回溯,删掉list列表到最后一个元素
}
}
}