上海中小网站建设,北京 网站设计飞沐,c 做交易网站,工作室网站建设方案模板77 组合
组合无序#xff0c;排列有序。1~n个数中选k个数组合#xff0c;k不确定#xff0c;组合的方式。 #xff08;图片来自代码随想录#xff09;确定回溯法的三部曲#xff1a;
递归函数的返回值和参数#xff1a;集合n中取k个数#xff0c;#xff0c;每次从…77 组合
组合无序排列有序。1~n个数中选k个数组合k不确定组合的方式。 图片来自代码随想录确定回溯法的三部曲
递归函数的返回值和参数集合n中取k个数每次从不同的位置开始定义startIndex调整可以选择的范围[startIndex, n]。需要记录所有的组合和每次的组合数定义两个全局变量记录每一个组合的vectorint path和记录所有组合结果的vectorint result。确定回溯函数的终止条件path.size() k; result.push_back(path)。确定回溯单层搜索逻辑
for(int i startIndex; i n; i){//控制树的横向遍历path.push_back(i);//处理节点backtracking(n, k, i1);//控制树的纵向遍历从i1开始path.pop_back();//回溯撤销现在处理的节点处理下一个节点
}对于组合总数小于k比如4如何处理处理过程跳过if判断跳过for的循环执行backtracking结束隐含一个return的结束。
组合的修剪
如何修剪for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了那么就没有必要搜索了。n总数k组合数path.size()已经加入组合的元素个数k-path.size()还需要组合的数n-(k-path.size())1满足组合总数为k的最低开始位置。确定修剪的代码
for(int i startIndex; i n-(k-path.size()); i){path.push_back(i);backtracking(n, k, i1);path.pop_back();
}