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

( ͡• ͜ʖ ͡• )

目录

理论基础

[77. 组合](#77. 组合)


理论基础

其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。

题目链接/文章讲解:代码随想录

视频讲解:带你学透回溯算法(理论篇)| 回溯法精讲!_哔哩哔哩_bilibili

了解了回溯法的基本知识,初步了解了适用的题目,它的模型算法框架如下:

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

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

77. 组合

对着 在 回溯算法理论基础 给出的 代码模板,来做本题组合问题,大家就会发现 写回溯算法套路。

在回溯算法解决实际问题的过程中,大家会有各种疑问,先看视频介绍,基本可以解决大家的疑惑。

本题关于剪枝操作是大家要理解的重点,因为后面很多回溯算法解决的题目,都是这个剪枝套路。

题目链接/文章讲解:代码随想录

视频讲解:带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

剪枝操作:带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

题目:

给定两个整数 nk,返回范围 [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]]

思路:

如果采用暴力写法,难免会陷入需要嵌套k层for循环之类的问题,所以用回溯法递归来解决嵌套层数的问题

递归来做层叠嵌套,每一次的递归中嵌套一个for循环,那么递归就可以用于解决多层嵌套循环的问题了

具体代码如下:

cpp 复制代码
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) {
        backtracking(n, k, 1);
        return result;
    }
};
相关推荐
9命怪猫3 小时前
AI大模型-提示工程学习笔记5-零提示
人工智能·笔记·学习·ai·提示工程
Felix_12153 小时前
2025 西电软工数据结构机考 Tip (By Felix)
算法
17´3 小时前
使用QT+OpenCV+C++完成一个简单的图像处理工具
c++·图像处理·qt·opencv
苹果4 小时前
C++二十三种设计模式之迭代器模式
c++·设计模式·迭代器模式
达子6664 小时前
笔记-使用ffmpeg产生rtsp视频流,然后用进行VLC播放
windows·笔记·ffmpeg
飞yu流星5 小时前
C++ 函数 模板
开发语言·c++·算法
没有名字的鬼5 小时前
C_字符数组存储汉字字符串及其索引
c语言·开发语言·数据结构
pursuit_csdn5 小时前
力扣 74. 搜索二维矩阵
算法·leetcode·矩阵
labuladuo5205 小时前
洛谷 P8703 [蓝桥杯 2019 国 B] 最优包含(dp)
算法·蓝桥杯·动态规划
Goldinger5 小时前
vscode 配置c/c++环境 中文乱码
c语言·c++·vscode