216.组合总和III
回溯法三部曲
递归函数的返回值以及参数
在这里要定义两个全局变量,一个用来存放符合条件单一结果,一个用来存放符合条件结果的集合
回溯函数终止条件
path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了,在图中path存的就是根节点到叶子节点的路径。
单层搜索的过程
回溯法的搜索过程就是一个树型结构的遍历过程,在如下图中,可以看出for循环用来横向遍历,递归的过程是纵向遍历。
17.电话号码的字母组合
如果是暴力的话 k的数量增多,循环处理就会很多,这里需要使用回溯
回溯三部曲:
确定回溯函数参数
首先需要一个字符串s来收集叶子节点的结果,然后用一个字符串数组result保存起来,这两个变量我依然定义为全局。
再来看参数,参数指定是有题目中给的string digits,然后还要有一个参数就是int型的index
例如输入用例"23",两个数字,那么根节点往下递归两层就可以了,叶子节点就是要收集的结果集。
那么终止条件就是如果index 等于 输入的数字个数(digits.size)了(本来index就是用来遍历digits的)。
然后收集结果,结束本层递归
确定单层遍历逻辑
首先要取index指向的数字,并找到对应的字符集(手机键盘的字符集)。
然后for循环来处理这个字符集
intdigit=digits[index]-'0';// 将index指向的数字转为intstring letters=letterMap[digit];// 取数字对应的字符集for(inti=0;i<letters.size();i++){s.push_back(letters[i]);// 处理backtracking(digits,index+1);// 递归,注意index+1,一下层要处理下一个数字了s.pop_back();// 回溯}
此外,异常情况需要考虑到!