216.组合总和III
题目链接/文章讲解:代码随想录
按照模板 剪枝
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(k, n, 1, 0);
return res;
}
public void backtracking(int k, int n, int startIndex, int sum) {
if(sum > n) return;
// if(path.size() > k) return;
// if(path.size() == k && sum == n) {
// res.add(new ArrayList<>(path));
// return;
// }
// for(int i = startIndex; i <= 9; i++) {
// path.add(i);
// sum += i;
// backtracking(k, n, i + 1, sum);
// sum -= i;
// path.removeLast();
// }
if(path.size() == k) {
if(sum == n) {
res.add(new ArrayList<>(path));//注意这里不能是&& 因为要保证path.size == k 时返回
}
return;
}
for(int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {
path.add(i);
sum += i;
backtracking(k, n, i + 1, sum);
sum -= i;
path.removeLast();
}
}
}
17.电话号码的字母组合
题目链接/文章讲解:代码随想录
有点绕
利用num索引找到digits的数字,进而找到strNumber中对应的字符串,对字符串进行遍历,包含下一级的递归,使用num+1进入下一级递归;
num从0开始,当num = digits.length()时,说明递归结束
class Solution {
List<String> res = new ArrayList<>();//全局变量
StringBuilder temp = new StringBuilder();
public List<String> letterCombinations(String digits) {
if(digits == null || digits.length() == 0) return res;
String[] strNumber = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
backtracking(digits,strNumber,0);
return res;
}
public void backtracking(String digits, String[] strNumber, int num) {
if(num == digits.length()) {//终止条件
res.add(temp.toString());
return;
}
String str = strNumber[digits.charAt(num) - '0'];//找到num对应的字符串
for(int i = 0; i < str.length(); i++) {//字符串里进行遍历
temp.append(str.charAt(i));
backtracking(digits, strNumber,num + 1);//num+ 1代表下一个数字对应的字符串
temp.deleteCharAt(temp.length() - 1);//回溯
}
}
}