代码随想录算法训练营第二十四天补|● 回溯理论基础 ● 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;
    }
};
相关推荐
MATLAB代码顾问4 小时前
多种时间序列预测算法的MATLAB实现
开发语言·算法·matlab
m0_736927044 小时前
2025高频Java后端场景题汇总(全年汇总版)
java·开发语言·经验分享·后端·面试·职场和发展·跳槽
FAREWELL000754 小时前
Lua学习记录(3) --- Lua中的复杂数据类型_table
开发语言·学习·lua
IT北辰5 小时前
Python实现居民供暖中暖气能耗数据可视化分析(文中含源码)
开发语言·python·信息可视化
KWTXX5 小时前
组合逻辑和时序逻辑的区别
java·开发语言·人工智能
高山上有一只小老虎5 小时前
字符串字符匹配
java·算法
wjs20245 小时前
Go 语言结构体
开发语言
程序猿_极客5 小时前
JavaScript 的 Web APIs 入门到实战全总结(day7):从数据处理到交互落地的全链路实战(附实战案例代码)
开发语言·前端·javascript·交互·web apis 入门到实战
Predestination王瀞潞5 小时前
Python __name__ 与 __main__
开发语言·python
愚润求学5 小时前
【动态规划】专题完结,题单汇总
算法·leetcode·动态规划