当前位置: 首页 > news >正文

代码随想录算法训练营第二十四天|● 理论基础 ● 77. 组合

仅做学习笔记,详细请访问代码随想录

● 理论基础
● 77. 组合

● 理论基础

回溯法解决的问题
回溯法,一般可以解决如下几种问题:

组合问题:N个数里面按一定规则找出k个数的集合
切割问题:一个字符串按一定规则有几种切割方式
子集问题:一个N个数的集合里有多少符合条件的子集
排列问题:N个数按一定规则全排列,有几种排列方式
棋盘问题:N皇后,解数独等等

回溯法模板
这里给出Carl总结的回溯算法模板。

在讲二叉树的递归 (opens new window)中我们说了递归三部曲,这里我再给大家列出回溯三部曲。

回溯函数模板返回值以及参数
在回溯算法中,我的习惯是函数起名字为backtracking,这个起名大家随意。

回溯算法中函数返回值一般为void。

再来看一下参数,因为回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。

但后面的回溯题目的讲解中,为了方便大家理解,我在一开始就帮大家把参数确定下来。

回溯函数伪代码如下:

void backtracking(参数)
回溯函数终止条件
既然是树形结构,那么我们在讲解二叉树的递归 (opens new window)的时候,就知道遍历树形结构一定要有终止条件。

所以回溯也有要终止条件。

什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。

所以回溯函数终止条件伪代码如下:

if (终止条件) {
存放结果;
return;
}
回溯搜索的遍历过程
在上面我们提到了,回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。

如图:
在这里插入图片描述
注意图中,我特意举例集合大小和孩子的数量是相等的!

回溯函数遍历过程伪代码如下:

for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
for循环就是遍历集合区间,可以理解一个节点有多少个孩子,这个for循环就执行多少次。

大家可以从图中看出for循环可以理解是横向遍历,backtracking(递归)就是纵向遍历,这样就把这棵树全遍历完了,一般来说,搜索叶子节点就是找的其中一个结果了。

分析完过程,回溯算法模板框架如下:

void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}

for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果
}

}

● 77. 组合

class Solution {
private:vector<vector<int>> result; // 存放符合条件结果的集合vector<int> path; // 用来存放符合条件结果void backtracking(int n, int k, int startIndex) {if (path.size() == k) {result.push_back(path);return;}for (int i = startIndex; i <= n; i++) {path.push_back(i); // 处理节点backtracking(n, k, i + 1); // 递归path.pop_back(); // 回溯,撤销处理的节点}}
public:vector<vector<int>> combine(int n, int k) {result.clear(); // 可以不写path.clear();   // 可以不写backtracking(n, k, 1);return result;}
};
http://www.lryc.cn/news/292697.html

相关文章:

  • 买保险如何填健康告知
  • 云贝教育 | 【技术文章】Oracle 19c RAC修改网络
  • Android SELinux:保护您的移动设备安全的关键
  • 第十三章认识Ajax(四)
  • 使用 Node.js 和 Cheerio 爬取网站图片
  • 2024美赛数学建模E题思路源码
  • 解决Docker AList本地挂载失效的问题。
  • Emmet常用语法总结
  • Android 12系统源码_页面管理(四)获取系统当前最上层的Activity信息
  • RK3588开发板Ubuntu与开发板使用U盘互传
  • 【BUG】golang gorm导入数据库报错 “unexpected type clause.Expr“
  • TCP/IP网络模型
  • github连不上
  • Excel计算表达式的值
  • 26元/月起!腾讯云一键自动搭建4核16G幻兽帕鲁服务器
  • 【C++游戏开发-01】推箱子
  • 【lesson26】学习MySQL事务前的基础知识
  • 持续积累分享金融知识
  • 网络协议 UDP协议
  • 爬虫笔记(三):实战qq登录
  • 又涨又跌 近期现货黄金价格波动怎么看?
  • 软件压力测试:探究其目的与重要性
  • Android.bp入门指南之浅析Android.bp文件
  • 2024年美赛 (D题ICM)| 湖流网络水位控制 |数学建模完整代码+建模过程全解全析
  • 安卓网格布局GridLayout
  • DHCP简介
  • Hadoop生态系统中一些关键组件的详细解析
  • 功能强大的开源数据中台系统 DataCap 2024.01.1 发布
  • Redis的bitmap使用不当,我内存爆了
  • 基于python的新闻爬虫