我相信苦涩的眼泪
开始之前学习一个单词热热身:non-negligibleadj.不可忽视的;重大的;Contents"组合问题",即`N`个数里面按一定规律找出`k`个数的集合。组合(77)2组合总和III(26)3电话号码的字母组合(7)4组合总和(39,集合无重复元素、数字可重复选取)5组合总和II(40,集合有重复元素、数字不可重复选取)"分割问题",即一个字符串按一定规则有几种切割方式。6分割回文串(3)7复原IP地址(93)8子集(78)9求根到叶子节点数字之和(29)回溯法解决的问题都可以抽象为树形结构(N叉树),回溯法的搜索过程就是一个树形结构的遍历过程。回溯法的求解过程可表示为在一棵解空间树做深度优先搜索。按照回溯算法模板做题,最起码你对照问题知道该思考什么东西。。"组合问题",即N个数里面按一定规律找出k个数的集合。
组合(77)题目:
???给定两个整数n和k,返回...n中所有可能的k个数的组合。
示例:
思路:(图片来源:代码随想录)???本题符合"组合问题",即N个数里面按一定规律找出k个数的集合。按照回溯算法模板框架:
①终止条件
???题目需返回k个数的集合,则当存储子集的size等于k时,达到终止条件,应该返回;
②单层搜索过程???如图中,for循环用于横向遍历,递归用于纵向遍历;定义一个参数startIndex用于记录横向遍历中从哪一个数开始。
③确定回溯函数的返回值及参数???回溯函数的返回值一般为void,参数为n、k、startIndex。
classSolution{public:vectorvectorintres;vectorinttemp;voidbacktracking(intn,intk,intstartIndex){if(temp.size()==k){res.push_back(temp);return;}for(inti=startIndex;i=n;i++){temp.push_back(i);//相当于记录for循环之下的第一个pathbacktracking(n,k,i+);temp.pop_back();//相当于模板中的回溯,撤销处理结果}}vectorvectorint