思路:回溯
对于这类寻找所有可行解的题,我们都可以尝试用「搜索回溯」的方法来解决。
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
int len = candidates.length;
List<List<Integer>> res = new ArrayList<>();
if(len == 0){
return res;
}
//排序是剪枝的前提
Arrays.sort(candidates);
Deque<Integer> path = new ArrayDeque<>();
dfs(candidates,0,len,target,path,res);
return res;
}
private void dfs(int[] candidates,int begin,int len,int target,Deque<Integer> path,List<List<Integer>> res){
// 由于进入更深层的时候,小于 0 的部分被剪枝,因此递归终止条件值只判断等于 0 的情况
if(target == 0){
res.add(new ArrayList<>(path));
return;
}
for(int i=begin;i<len;i++){
// 重点理解这里剪枝,前提是候选数组已经有序,
if(target-candidates[i]<0){
break;
}
path.addLast(candidates[i]);
dfs(candidates,i,len,target-candidates[i],path,res);
path.removeLast();
}
}
}