77. 组合

简介: 回溯法是一种通过递归搜索解决问题的算法,适用于组合、切割、子集、排列和棋盘等问题。以“77. 组合”为例,给定整数n和k,需找出[1, n]中所有可能的k个数的组合。此问题可抽象为树形结构,n为树宽,k为树深。通过递归与回溯,每次从集合中选取元素并调整范围,当路径长度等于k时收集结果。题解中使用`backtracking`函数实现递归,利用`path`记录当前组合,最终返回所有符合条件的结果。

理论基础:

什么是回溯法?

回溯法也可以叫做回溯搜索法,它是一种搜索的方式。

回溯法解决的问题

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

组合问题:N个数里面按一定规则找出k个数的集合

切割问题:一个字符串按一定规则有几种切割方式

子集问题:一个N个数的集合里有多少符合条件的子集

排列问题:N个数按一定规则全排列,有几种排列方式

棋盘问题:N皇后,解数独等等

如何理解回溯法?

回溯法解决的问题都可以抽象为树形结构,是的,我指的是所有回溯法的问题都可以抽象为树形结构!

因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。

递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。

 题目:

77. 组合

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

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

示例 1:

输入:n = 4, k = 2

输出:

[

 [2,4],

 [3,4],

 [2,3],

 [1,2],

 [1,3],

 [1,4],

]

示例 2:

输入:n = 1, k = 1

输出:[[1]]

提示:

1 <= n <= 20

1 <= k <= n

思考历程与知识点:  

每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围。

图中可以发现n相当于树的宽度,k相当于树的深度。

图中每次搜索到了叶子节点,我们就找到了一个结果。

相当于只需要把达到叶子节点的结果收集起来,就可以求得 n个数中k个数的组合集合。

题解:

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;
    }
};


相关文章
|
6月前
|
C++
20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
本内容涵盖三道编程题的题目与题解,包括“有效的括号”(使用栈判断括号是否匹配)、“删除字符串中的所有相邻重复项”(利用栈删除相邻重复字符)以及“逆波兰表达式求值”(通过栈计算后缀表达式的结果)。每道题均采用C++实现,详细展示了栈在解决匹配问题、字符串处理和表达式求值中的应用。代码逻辑清晰,适合学习栈数据结构的应用场景与实现方法。
|
6月前
|
算法 C++
530.二叉搜索树的最小绝对差 ,501.二叉搜索树中的众数 ,236. 二叉树的最近公共祖先
本内容涵盖了三道二叉树相关的问题及其解法,涉及二叉搜索树的最小绝对差、二叉搜索树中的众数以及二叉树的最近公共祖先。通过中序遍历将二叉搜索树转化为有序数组以求最小差值;利用哈希表统计节点值频率并排序找出众数;通过递归方法寻找二叉树中两节点的最近公共祖先。这些题目展示了二叉树遍历、递归及数据结构应用的核心思想,是深入理解二叉树算法的重要实践。
|
6月前
|
算法
104.二叉树的最大深度 , 111.二叉树的最小深度,222.完全二叉树的节点个数
本内容主要讲解了三道与二叉树相关的算法题及其解法,包括“二叉树的最大深度”、“二叉树的最小深度”和“完全二叉树的节点个数”。通过递归方法(前序或后序遍历)实现求解。 - **最大深度**:利用后序遍历计算根节点到最远叶子节点的路径长度。 - **最小深度**:同样采用后序遍历,但需特别处理单子树为空的情况,确保找到从根到最近叶子节点的路径。 - **完全二叉树节点数**:基于递归后序遍历统计左右子树节点数量并累加。 代码示例清晰展示了递归逻辑,帮助理解二叉树深度与高度的概念及其实现方式。
|
6月前
|
机器学习/深度学习 人工智能 PyTorch
200行python代码实现从Bigram模型到LLM
本文从零基础出发,逐步实现了一个类似GPT的Transformer模型。首先通过Bigram模型生成诗词,接着加入Positional Encoding实现位置信息编码,再引入Single Head Self-Attention机制计算token间的关系,并扩展到Multi-Head Self-Attention以增强表现力。随后添加FeedForward、Block结构、残差连接(Residual Connection)、投影(Projection)、层归一化(Layer Normalization)及Dropout等组件,最终调整超参数完成一个6层、6头、384维度的“0.0155B”模型
368 11
200行python代码实现从Bigram模型到LLM
|
6月前
|
SQL 存储 缓存
Fluss 实战:用 Partial Update 构建实时宽表的新范式
传统流式数据管道通过多表 Join 构建宽表,如实时推荐引擎需整合用户偏好、购买记录等8个数据源,但此方法在大规模场景下状态管理复杂、资源消耗高且调试困难。Fluss 提出部分更新方案,基于主键将各数据源独立写入共享宽表,避免复杂 Join 操作。示例中,通过 Flink SQL 创建推荐、曝光、点击等表,并逐步插入数据实现宽表构建。最终,借助 Fluss 的高效合并机制,输出包含最新信息的统一视图,提升可扩展性和维护性。
352 8
Fluss 实战:用 Partial Update 构建实时宽表的新范式
|
6月前
|
安全 数据可视化 Linux
在线游戏的地基:VPS和专用服务器性价比大比拼!
游戏服务器是在线游戏的基石,选择合适的服务器类型对玩家体验至关重要。本文对比了VPS(虚拟专用服务器)和专用服务器的优劣势:VPS经济灵活、易于管理,但性能和安全存在局限,适合预算有限或玩家规模适中的游戏;专用服务器性能强大、安全可靠且可控性高,但成本和技术门槛较高,更适合大型MMO或竞技游戏。根据游戏类型、预算、技术能力和扩展需求,合理选择服务器类型是关键。初创阶段可选用中端VPS,成长阶段考虑高端VPS或低端专用服务器,成熟阶段则需高端专用服务器集群。未来,混合架构或将实现性能与成本的平衡。最终,以玩家流畅体验为导向,选择最适合的服务器方案。
224 3
|
6月前
|
存储 缓存 数据挖掘
阿里云服务器实例选购指南:经济型、通用算力型、计算型、通用型、内存型性能与适用场景解析
当我们在通过阿里云的活动页面挑选云服务器时,相同配置的云服务器通常会有多种不同的实例供我们选择,并且它们之间的价格差异较为明显。这是因为不同实例规格所采用的处理器存在差异,其底层架构也各不相同,比如常见的X86计算架构和Arm计算架构。正因如此,不同实例的云服务器在性能表现以及适用场景方面都各有特点。为了帮助大家在众多实例中做出更合适的选择,本文将针对阿里云服务器的经济型、通用算力型、计算型、通用型和内存型实例,介绍它们的性能特性以及对应的使用场景,以供大家参考和选择。
|
6月前
|
机器学习/深度学习 监控 算法
局域网行为监控软件 C# 多线程数据包捕获算法:基于 KMP 模式匹配的内容分析优化方案探索
本文探讨了一种结合KMP算法的多线程数据包捕获与分析方案,用于局域网行为监控。通过C#实现,该系统可高效检测敏感内容、管理URL访问、分析协议及审计日志。实验表明,相较于传统算法,KMP在处理大规模网络流量时效率显著提升。未来可在算法优化、多模式匹配及机器学习等领域进一步研究。
196 0