【练习】【回溯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;             // 返回所有组合
    }
};
相关推荐
爱笑的Sunday15 分钟前
【LeetCode 题解】算法:15.三数之和
java·数据结构·算法·leetcode
John Art37 分钟前
PAT甲级(Advanced Level) Practice 1028 List Sorting
算法
花鱼白羊41 分钟前
代码随想录刷题day52|(二叉树篇)106.从中序与后序遍历序列构造二叉树(▲
算法
Tadecanlan1 小时前
[C++面试] 你了解视图吗?
开发语言·c++
ゞ 正在缓冲99%…1 小时前
leetcode3.无重复字符的最长字串
算法·leetcode·滑动窗口
一只_程序媛1 小时前
【leetcode hot 100 739】每日温度
算法·leetcode·职场和发展
我想吃余1 小时前
【初探数据结构】二叉树的顺序结构——堆的实现详解(上下调整算法的时间复杂度分析)
数据结构·算法
Phoebe鑫1 小时前
数据结构每日一题day2(顺序表)★★★★★
数据结构·算法·leetcode
染指11102 小时前
53.第二阶段x86游戏实战2-c++实现自动打怪2
开发语言·c++·游戏·游戏逆向
Feliz..2 小时前
蓝桥杯真题 2109.统计子矩阵
线性代数·算法·矩阵