【练习】【回溯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;             // 返回所有组合
    }
};
相关推荐
静水流深-刘申15 分钟前
算法继续刷起-2025年09月26日
开发语言·c++·算法
平平无奇。。。35 分钟前
C++11之异常
开发语言·c++·visual studio
木头左38 分钟前
跨周期共振效应在ETF网格参数适配中的应用技巧
开发语言·python·算法
顾你&1 小时前
机器学习之无监督学习算法大总结
学习·算法·机器学习
神龙斗士2402 小时前
Java 数组的定义与使用
java·开发语言·数据结构·算法
Y.O.U..2 小时前
力扣HOT100-跳跃游戏II
算法·leetcode
我叫黑大帅2 小时前
什么是 mmap?
linux·c++·操作系统
hn小菜鸡2 小时前
LeetCode 3132.找出与数组相加的整数 II
算法·leetcode·职场和发展
微笑尅乐2 小时前
数组模拟加法——力扣66.加一
算法·leetcode·职场和发展
玖笙&2 小时前
✨WPF编程基础【1.2】:XAML中的属性
c++·wpf·visual studio