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

组合(力扣77)

从这道题开始,我们正式进入回溯算法的学习。之前在二叉树中只是接触到了一丢丢,而这里我们将使用回溯算法解决很多经典问题。

那么这道题是如何使用回溯算法的呢?在讲回溯之前,先说明一下此题是如何递归的。毕竟回溯递归不分家,必须先有递归,才会有回溯。而这里的递归就是在题目所给集合的子集中使用for循环选择数字。考虑组合的无序性(1,2和2,1是相同的组合),那么在对递归得到的子集进行遍历时,需要用变量控制for循环的起始位置。另外,如果题目说明不能取重复数字,那么在对该控制变量赋值时,需要注意。举个例子:最开始的集合有1,2,3,4,那么我们第一次一定是从这个集合中选一个数。为了保证之后不重复选择1,我们下一步一定是从2,3,4这个集合中选一个数,以此类推。我们可以发现递归得到的子集范围在不断缩小。接下来讲一下回溯,我们需要写一个for循环将递归函数包起来,这个for循环的作用是遍历当前集合的所有数,假设在第一个集合中我们已经选了1这个数,然后递归选择第二个数,那么在选择第二个数的递归函数结束之后,我们可以将1弹出存储组合的数组,并通过for循环选择第一个集合中的第二个数,这样就得到了其他组合情况。这道题大家可以当做模版题记下来,之后的回溯算法的代码风格都与这道题大差不差。可以结合我下面的代码及注释理解这道题。

代码及注释如下:

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.mrgr.cn/news/89965.html

相关文章:

  • CSS 相关知识
  • 【Java基础】为什么不支持多重继承?方法重载和方法重写之间区别、Exception 和 Error 区别?
  • 单例设计模式(Java)
  • Vue 鼠标事件合集,关于鼠标右键的处理方法(改写鼠标右键方法、自定义鼠标右键)
  • 2021 年 9 月青少年软编等考 C 语言五级真题解析
  • unity碰撞的监测和监听
  • Ollama下载安装教程
  • Unity Dots学习
  • 【0404】Postgres内核 实现分配一个新的 Object ID (OID)
  • gitlab多项目流水线
  • C++Primer学习(2.2)
  • 【LeetCode 刷题】贪心算法(4)-区间问题
  • ubuntu20.04+RTX4060Ti大模型环境安装
  • 【机器学习】超参数的选择,以kNN算法为例
  • 学习数据结构(6)单链表OJ上
  • redis之GEO 模块
  • mysql8 从C++源码角度看sql生成抽象语法树
  • 2025年日祭
  • unity学习29:摄像机camera相关skybox 和 Render Texture测试效果
  • 【LeetCode 刷题】贪心算法(2)-进阶
  • 第 26 场 蓝桥入门赛
  • Java中的继承及相关概念
  • .NET Core 8 Blazor 和 Vue 3 技术构建网
  • 微信小程序案例2——天气微信小程序(学会绑定数据)
  • Vite+TS项目中配置路径别名
  • OC-Block