回溯模板
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
77. 组合
第一道回溯,想到了回溯树,但具体怎么转化为回溯还是看了教程
1.想出一个树的思维导图
第一个数的选项 1 2 3...
第二个数的选项 2 3 4... 2 3 4... 2 3 4...
....
2.for横向遍历 递归纵向遍历
剪枝!!!
每个for如果还需要3个元素 那n-3+1之后的遍历都不需要,因为凑不够三个,但原代码仍然执行只是不return
for(int a=startindex;a<=n-(k-tmp.size())+1;a++)
216.组合总和III
回忆模板写很好写,剪枝也想出来了(一个是for里面的一个是一但大于targetsum就返回)
但for里面有两种剪枝,
一种是我的i<targetsum-sum
一种是和前一题一样的
9 - (k - path.size()) + 1
感觉两种取个min好一点
17.电话号码的字母组合
用一个map完成数字和字母之间的转换!(lettermap是起的名字,const也可以去掉)
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
依然是按照backtracking的模板