回溯模板:
backtrack() {
if(终止) {
放入结果集合;
return;
}
for(本层集合中元素) {
处理节点;
backtrack();//递归
回溯,恢复现场;
}
}
77. 组合
1-n中k个数的组合
思路:套用模板
这里用图辅助:
向下递归就是调用函数自身,for遍历集合元素
public void combination(int n, int k, int startIndex) {
if(list.size() == k) {
result.add(new ArrayList<>(list));
return;
}
for(int i=startIndex;i<=n - (k-list.size()) + 1;i++) {
list.add(i);
combination(n,k,i+1);
list.remove(list.size()-1);
}
}
216.组合总和III
题目链接:216. 组合总和 III - 力扣(LeetCode)
public void backtrack(int k, int n,int start) {
if(sum == n && list.size() == k) {
result.add(new ArrayList(list));
return;
}
if(sum > n) return;
for(int i=start;i<=9;i++) {
sum += i;
list.add(i);
backtrack(k,n,i+1);
sum -= i;
list.remove(list.size()-1);
}
}
17.电话号码的字母组合
题目链接:17. 电话号码的字母组合 - 力扣(LeetCode)
思路:
这个有点繁琐,把每个按键放入数组
每个递归取出集合中的一个元素,比如第一个递归取2,第二个取3第三个取4;
class Solution {
List<String> result = new ArrayList<>();
StringBuilder sb = new StringBuilder();
StringBuilder sbb = new StringBuilder();
String[] letterMap = new String[]{
"",//0
"",//1
"abc",//2
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
};
public List<String> letterCombinations(String digits) {
if(digits.length() == 0) return result;
backtrack(digits,0);
return result;
}
public void backtrack(String digits, int index) {
if(digits.length() == index) {
sbb = sb;
result.add(sbb.toString());
return;
}
int idx = digits.charAt(index) - '0';
String letter = letterMap[idx];
for(int i=0;i<letter.length();i++) {
sb.append(letter.charAt(i));
backtrack(digits,index+1);
sb.delete(sb.length()-1,sb.length());
}
}
}