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

回溯理论基础、组合问题

回溯理论基础

回溯能解决的问题

回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案

回溯如何穷举:

横向遍历for循环,纵向遍历backtracking(递归),一般来说,搜索叶子节点就是找的其中一个结果。

注意:如何避免重复,利用startIndex

回溯法模板

回溯函数模板返回值以及参数

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

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

既然是树形结构,那么我们在讲解二叉树的递归 (opens new window)的时候,就知道遍历树形结构一定要有终止条件。所以回溯也有要终止条件。什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点 了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。
回溯搜索的遍历过程

在上面我们提到了,回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。

模板伪代码

cpp 复制代码
void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

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

77. 组合

给定两个整数 n 和 k,返回范围 1, n 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

思路: 参照回溯模板即可,重点搞明白 startIndex去重、如何回溯

cpp 复制代码
class Solution {
public:
    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循环
        for(int i = startIndex; i <= n; i++){
            //startIndex = i+1 用于横向遍历去重,纵向下一层时从i+1进行横向遍历
            path.push_back(i);
            //纵向遍历,递归
            backtracking(n, k, i+1);
            path.pop_back(); //回溯,撤销处理结果
        }
    }

    vector<vector<int>> combine(int n, int k) {
        if(k > n) return result;
        backtracking(n, k, 1);
        return result;
    }
};
相关推荐
北冥you鱼12 分钟前
Go 语言 GORM 使用 Preload:从关联查询到嵌套预加载的完整实践
开发语言·jvm·golang
silvamux_18 分钟前
微头条爆款体平台适配实测:把交付要求变成可计算的指标
java·线性代数·算法·决策树·矩阵
dingzd9524 分钟前
TikTok账号登录态失效的Cookie字段排查路径
开发语言·php·跨境电商·营销策略
曹牧38 分钟前
C#:The operation has timed out
开发语言·c#
你看我名字1 小时前
数眼智能 Search + Reader 实战:联网问答怎样避免“搜到了,却引用错了”
android·java·开发语言
重生之小比特1 小时前
【算法拾光】前缀和|连续的子数组和 + 和相同的二元子数组
算法·leetcode·哈希算法
小嘉丶学长1 小时前
Day13 · 列表与元组
linux·运维·服务器·开发语言·python
努力努力再努力wz1 小时前
【Lua入门系列】从 C++ 迭代器到 Lua 迭代器:一文深入理解 Lua 有状态以及无状态迭代器与泛型for、闭包、ipairs、pairs 和 next
开发语言·c++·lua
一去不复返的通信er1 小时前
力扣15:盛最多水的容器
算法·leetcode
努力实干1 小时前
第二阶段 · 第 7 课:C++ 多线程与线程安全
开发语言·c++·安全