一、题目
二、代码
回溯
class Solution {
List<List<Integer>> result = new LinkedList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
//visited 路径
List<Integer> visited = new LinkedList<>();
int start = 0;
//选择列表 candidates
backtrack(visited, candidates,target, start);
return result;
}
// public void backtrack(路径,选择列表){
// if(满足结束条件){
// result.add(结果);
// }
// for(选择:选择列表){
// 做出选择;
// backtrack(路径,选择列表);
// 撤销选择;
// }
//引入start的目的是为了去重,重复的原因是在较深层的结点值考虑了之前考虑过的元素,所以需要设置下一轮搜索的起点
public void backtrack(List<Integer> visited, int[] candidates, int target, int start){
if(target < 0){
return;
}
if(target == 0){
result.add(new LinkedList(visited));
return;
}
for(int i = start; i < candidates.length; i++){
visited.add(candidates[i]);
backtrack(visited, candidates, target - candidates[i], i);
visited.remove(visited.size() - 1);
}
}
}