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

组合(力扣77)

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

那么这道题是如何使用回溯算法的呢?在讲回溯之前,先说明一下此题是如何递归的。毕竟回溯递归不分家,必须先有递归,才会有回溯。而这里的递归就是在缩小范围后的集合中使用for循环选择数字。举个例子:最开始的集合有1,2,3,4,那么我们第一次一定是从这个集合中选一个数。为了保证之后不重复选择1,我们下一步一定是从2,3,4这个集合中选一个数,以此类推。我们可以发现被选择集合的范围在不断缩小。还有就是,需要考虑组合的无序性(1,2和2,1是相同的组合),那么每一层递归中的for循环的遍历范围都要改变,这就需要设置一个变量来控制。接下来讲一下回溯,我们需要写一个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.kler.cn/a/536354.html

相关文章:

  • 攻防世界 文件上传
  • C++版本DES加密/解密
  • OpenCV:特征检测总结
  • 详解python的单例模式
  • 如何使用el-table的多选框
  • 自动化测试、压力测试、持续集成
  • 网站快速收录:如何优化网站专题页面?
  • 如何依据使用场景挑选合适的3D扫描仪?
  • 流媒体技术原理
  • 4-kafka消费端之分区分配策略
  • SAP FICO 部分付款付款起算日期、销售订单、行取原始凭证增强
  • docker数据持久化的意义
  • 【10.6】队列-解从仓库到码头运输箱子
  • Python教学安排
  • AUTOSAR汽车电子嵌入式编程精讲300篇-基于FPGA的CAN FD汽车总线数据交互系统设计
  • 【R语言】plyr包和dplyr包
  • Elasticsearch 生产集群部署终极方案
  • vscode卡住---回退版本解决
  • Charles 远端代理到本地:Map Remote + http-server
  • 基于Simulink的步进电机控制系统仿真
  • 【前端基础】深入理解ES6新特性
  • systemverilog的genvar
  • 时序数据库:Influxdb详解
  • 英特尔至强服务器CPU销量创14年新低,AMD取得进展
  • Rust 的内存管理机制
  • 树莓集团深耕海南,为自贸港建设注入数字新活力