39. 组合总和
题目链接
dfs
class Solution {
List<List<Integer>> ans;
public List<List<Integer>> combinationSum(int[] candidates, int target) {
ans = new ArrayList<>();
dfs(candidates, target, new ArrayList<Integer>(), 0);
return ans;
}
private void dfs(int[] candidates, int target, List<Integer> now, int k){
if(target < 0) return;
if(target == 0){
ans.add(new ArrayList<Integer>(now));
return;
}
for(int i = k; i < candidates.length; i++){
now.add(candidates[i]);
target -= candidates[i];
dfs(candidates, target, now, i);
now.remove(now.size() - 1);
target += candidates[i];
}
}
}
- 这是代码经过优化的版本,ans放在外面无需传参,target直接减,不用计算sum
- 注意:加入ans的时候,需要重新new一个ArrayList,否则改变now会改变ans中元素的值
优化
- 上面的版本跑出来的时间不尽如人意,想来想去,觉得是List的add和remove太慢了,于是有了下面的优化
class Solution {
List<List<Integer>> ans;
public List<List<Integer>> combinationSum(int[] candidates, int target) {
ans = new ArrayList<>();
dfs(candidates, target, new ArrayList<Integer>(), 0);
return ans;
}
private void dfs(int[] candidates, int target, List<Integer> now, int k){
if(target == 0){
ans.add(new ArrayList<Integer>(now));
return;
}
for(int i = k; i < candidates.length; i++){
target -= candidates[i];
if(target >= 0){
now.add(candidates[i]);
dfs(candidates, target, now, i);
now.remove(now.size() - 1);
}
target += candidates[i];
}
}
}
- 将target大于等于0的判断提前,这样就不用操作List进下一层递归了
- 实测快了一倍