题目介绍
力扣78题:leetcode-cn.com/problems/su…
回溯
我们回顾一下回溯算法的模板:
result = []
public void backtrack(路径, 选择列表){
if (满足结束条件) {
result.add(路径);
return;
}
for (选择 in 选择列表) {
做选择;
backtrack(路径, 选择列表);
撤销选择;
}
}
直接套用模板,完成代码如下:
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
List<Integer> track = new ArrayList<>();
backTrack(nums, 0, track);
return res;
}
public void backTrack(int[] nums, int start, List<Integer> track) {
res.add(new ArrayList<Integer>(track));
for(int i = start; i < nums.length; i++) {
//做选择
track.add(nums[i]);
//递归
backTrack(nums, i + 1, track);
//回溯
track.remove(track.size() - 1);
}
}
}
可以看见,对 res 的更新是一个前序遍历,也就是说,res 就是树上的所有节点:
注意:自己问题使用回溯算法时,要用 start 参数排除已选择的数字。