【练习】【回溯No.1】力扣 77. 组合

题目

  1. 组合

给定两个整数 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]]

来源:力扣 77. 组合


思路(注意事项)

回溯模板

c 复制代码
void backtracking(参数) {
	 if (终⽌条件) {
		 存放结果;
		 return;
	 }
for (选择:本层集合中元素(树中节点孩⼦的数量就是集合的⼤⼩)) {
	 处理节点;
	 backtracking(路径,选择列表); // 递归
	 回溯,撤销处理结果
}

纯代码

c 复制代码
class Solution {
private:
    vector<vector<int>> ans;
    vector<int> path;
    void backtracking (int n, int k, int h)
    {
        if (path.size() == k)
        {
            ans.push_back(path);
            return;
        }
        for (int i = h; i <= n + 1 - (k - path.size()); 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 ans;
    }
};

题解(加注释)

c 复制代码
class Solution {
private:
    vector<vector<int>> ans;  // 存储所有组合的结果
    vector<int> path;         // 存储当前组合的路径

    // 回溯函数
    void backtracking(int n, int k, int start) {
        // 如果当前路径的长度等于 k,说明找到一个有效的组合
        if (path.size() == k) {
            ans.push_back(path);  // 将当前组合加入结果集
            return;
        }

        // 遍历可能的起始位置
        for (int i = start; i <= n + 1 - (k - path.size()); 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);  // 从数字 1 开始回溯
        return ans;             // 返回所有组合
    }
};
相关推荐
源代码•宸2 分钟前
C++高频知识点(二)
开发语言·c++·经验分享
ysh98887 分钟前
PP-OCR:一款实用的超轻量级OCR系统
算法
遇雪长安22 分钟前
差分定位技术:原理、分类与应用场景
算法·分类·数据挖掘·rtk·差分定位
数通Dinner26 分钟前
RSTP 拓扑收敛机制
网络·网络协议·tcp/ip·算法·信息与通信
jyan_敬言1 小时前
【C++】string类(二)相关接口介绍及其使用
android·开发语言·c++·青少年编程·visual studio
liulilittle2 小时前
SNIProxy 轻量级匿名CDN代理架构与实现
开发语言·网络·c++·网关·架构·cdn·通信
张人玉2 小时前
C# 常量与变量
java·算法·c#
tan77º2 小时前
【Linux网络编程】Socket - UDP
linux·服务器·网络·c++·udp
weixin_446122463 小时前
LinkedList剖析
算法
GiraKoo3 小时前
【GiraKoo】C++14的新特性
c++