思路:
一个典型的深度优先遍历(回溯)
注意遍历的起始是start,而不是0
代码:
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
int n=candidates.length;
//设置一个栈
Deque<Integer> path=new ArrayDeque<>();
List<List<Integer>> res=new ArrayList<>();
//排序
Arrays.sort(candidates);
bfs(n,candidates,0,target,0,path,res);
return res;
}
private void bfs(int n,
int[] candidates,
int sum,
int target,
int begin,
Deque<Integer> path,
List<List<Integer>> res){
if(target==sum){
res.add(new ArrayList<>(path));
return;
}
//关键步骤:剪枝
//在数据有序的前提下
if(sum>target){
return;
}
for(int i=begin;i<n;i++){
path.addLast(candidates[i]);
bfs(n,candidates,sum+candidates[i],target,i,path,res);
path.removeLast();
}
}
}
分解:
1)注意循环的开始是i=start而不是i=0
2)注意剪枝 sum>target时return
复杂度分析: