牛客地址
解题思路
深搜
实现代码
import java.util.*;
public class Solution {
private ArrayList<ArrayList<Integer>> res = new ArrayList<>();
public ArrayList<ArrayList<Integer>> combinationSum2(int[] num, int target) {
if(num == null || num.length == 0){
return res;
}
Arrays.sort(num);
dfs(num, 0, 0, target, new ArrayList<Integer>());
return res;
}
public void dfs(int[] num, int start, int curSum, int target, ArrayList<Integer> path){
if(start > num.length){
return;
}
if(curSum > target){
return;
}
if(curSum == target){
res.add(new ArrayList<Integer>(path));
return;
}
for(int i = start; i <= num.length - 1; i++){
if(i > start && num[i] == num[i-1]){
continue;
}
curSum += num[i];
path.add(num[i]);
dfs(num, i + 1, curSum, target, path);
curSum -= num[i];
path.remove(path.size() - 1);
}
}
}
注意事项
- 因为每个字母只能使用一次,所以要先排序。然后当num[i] == num[i-1]时直接continue;
- dfs中的start表示的是从[start, num,length - 1]的遍历,所以每次添加完path.add(nums[i]), 下一次应该调用的方法为dp(i + 1....);
- 递归出口为: start > num.length 不能为等于。