自己有一个域名怎么做网站个人工作室装修风格
news/
2025/10/7 10:21:14/
文章来源:
自己有一个域名怎么做网站,个人工作室装修风格,福田网站建设推荐,电商网站开发用什么软件好题目#xff1a;77. 组合
参考链接#xff1a;代码随想录
回溯法理论基础
回溯三部曲#xff1a;回溯函数模板返回值以及参数、回溯函数终止条件、回溯搜索的遍历过程。 模板框架#xff1a;
void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择…题目77. 组合
参考链接代码随想录
回溯法理论基础
回溯三部曲回溯函数模板返回值以及参数、回溯函数终止条件、回溯搜索的遍历过程。 模板框架
void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择本层集合中元素树中节点孩子的数量就是集合的大小) {处理节点;backtracking(路径选择列表); // 递归回溯撤销处理结果}
}77. 组合
思路本题一开始想到的肯定是用多层for循环嵌套但是需要k层而k是变量故使用这种暴力方法写不出来必须使用递归。我一开始还是想根据k来递归但是无法写出来。看了解析需要使用树形结构来理解回溯过程。 取数的过程可以首先取第一个数然后在剩下三个数里取出第二个数得到结果然后回溯取第二个数然后继续类推。故递归参数还需要一个取的第一个数的下标递归在取的数的数量为k的时候终止。其中for循环用于横向遍历递归用于纵向深度遍历。时间复杂度O(n*2^n)指数级别可以看到是暴力搜索。
class Solution {
public:vectorvectorint ans;vectorint path;void backtracking(int n,int k,int start){if(path.size()k){ans.push_back(path);return;}for(int istart;in;i){path.push_back(i);backtracking(n,k,i1);//由于第一个数已经取了i剩下就从i1开始取path.pop_back();//回溯撤销已经加入路径的节点}}vectorvectorint combine(int n, int k) {backtracking(n,k,1);return ans;}
};一开始很容易犯的一个错误是将回溯过程中的递归第二个参数写成k-1因为看上去是第二次只取k-1个数实际上此时的k的作用主要是用于判断递归是否终止是否终止是根据已经求出的深度决定的故k需要保持不变。 可以进行适当剪枝比如start的结尾值不需要为n可以为 n-(k-path.size())1 因为后续都不满 k-path.size() 个数了自然不可能取到。 k-path.size() 为一条路径还需要取的数的个数。
class Solution {
public:vectorvectorint ans;vectorint path;void backtracking(int n,int k,int start){if(path.size()k){ans.push_back(path);return;}for(int istart;in-(k-path.size())1;i){path.push_back(i);backtracking(n,k,i1);//由于第一个数已经取了i剩下就从i1开始取path.pop_back();//回溯撤销已经加入路径的节点}}vectorvectorint combine(int n, int k) {backtracking(n,k,1);return ans;}
};思路如下图所示 回溯法刚开始学多借助图来理解。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/930301.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!