216. 组合总和 III
- 和77题一样需要一维数组path来存放符合条件的结果,二维数组result来存放结果集。这里startIndex为下一层for循环搜索的起始位置,sum为需要求的目标和,算上需要传入的n、k我们可以确定回溯的传参了: backtracing(int n, int k, int startIndex, int sum)
- 接着确定终止条件,k其实就已经限制树的深度,因为就取k个元素,树再往下深了没有意义。所以如果path.size() 和 k相等了,就终止。因此if(sum == n && k == path.size()){终止条件}
- 最后是单层搜索的过程:这里需要注意n因为最多是9,所以剪枝优化的时候是9 - (k - path.size()) + 1,同时注意i+1调整startIndex,最后回溯。
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backtracing(n, k, 1, 0);
return res;
}
public void backtracing(int n, int k, int startIndex, int sum){
if(sum > n) return;
if(sum == n && k == path.size()){
res.add(new ArrayList(path));
}
for(int i = startIndex; i <= 9 - (k - path.size()) + 1; i ++){
path.add(i);
sum += i;
backtracing(n, k, i + 1, sum);
sum -= i;
path.removeLast();
}
}
}
17. 电话号码的字母组合
class Solution {
List<String> list = new ArrayList<>();
public List<String> letterCombinations(String digits) {
if(digits == null || digits.length() == 0){
return list;
}
String[] numString = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
backTracking(digits, numString, 0);
return list;
}
StringBuilder temp = new StringBuilder();
public void backTracking(String digits, String[] numString, int num){
if(num == digits.length()){
list.add(temp.toString());
return;
}
String str = numString[digits.charAt(num) - '0'];
for(int i = 0; i < str.length(); i ++){
temp.append(str.charAt(i));
backTracking(digits, numString, num+1);
temp.deleteCharAt(temp.length() - 1);
}
}
}