【练习】【回溯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;             // 返回所有组合
    }
};
相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
weilx12341 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
Smileyqp沛沛1 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车1 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark1 天前
大规模并行计算中的负载均衡算法研究4
算法
吞下星星的少年·-·1 天前
C++ 萌新语法入门篇
c++·算法比赛
Because_of_Her11 天前
并查集-听课笔记
笔记·算法·并查集