(C++回溯01) 组合

77、组合

回溯题目三步走

1. 确定参数

2. 确定终止条件

3. for 循环横向遍历,递归纵向遍历

cpp 复制代码
class Solution {
public:
    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();
        }
    }
    vector<vector<int>> combine(int n, int k) {
        backtracking(n, k, 1);
        return result;
    }
};

剪枝操作:

公式:n - (k - path.size()) + 1

k - path.size() 意思是还可选取多少元素

n - (k - path.size()) 意思是去掉可选取元素个数后的位置

n - (k - path.size()) + 1 为当前可以组合的最后一个位置

剪枝后代码:

cpp 复制代码
class Solution {
public:
    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++) {
            int flag = n - (k - path.size()) + 1;
            if(i > flag) {
                return;
            }
            path.push_back(i);
            backtracking(n, k, i + 1);
            path.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) {
        backtracking(n, k, 1);
        return result;
    }
};

216、组合总和 III

cpp 复制代码
class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    int count = 0;
    void backtracking(int k, int n, int startIndex) {
        if(path.size() == k) {
            if(count == n)
            result.push_back(path);
            return;
        }
        for(int i = startIndex; i < 10; i++) {
            path.push_back(i);
            count += i;
            backtracking(k, n, i + 1);
            path.pop_back();
            count -= i;
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(k, n, 1);
        return result;
    }
};

剪枝操作:

cpp 复制代码
class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    int count = 0;
    void backtracking(int k, int n, int startIndex) {
        if(path.size() == k) {
            if(count == n)
            result.push_back(path);
            return;
        }
        for(int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {
            count += i;
            if(count > n) {
                count -= i;
                return;
            }
            path.push_back(i);
            backtracking(k, n, i + 1);
            path.pop_back();
            count -= i;
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(k, n, 1);
        return result;
    }
};

17、电话号码的字母组合

cpp 复制代码
class Solution {
private:
    string letterMap[10] = {
        "",
        "",
        "abc", // 2
        "def", // 3
        "ghi", // 4
        "jkl", // 5
        "mno", // 6
        "pqrs", // 7
        "tuv", // 8
        "wxyz", // 9
    };
public:
    vector<string> result;
    string path;
    void backtacking(string& digits, int index) {
        if(index == digits.size()) {
            result.push_back(path);
            return;
        }
        string letters = letterMap[digits[index] - '0'];
        for(int i = 0; i < letters.size(); i++) {
            path.push_back(letters[i]);
            backtacking(digits, index + 1);
            path.pop_back();
        }
    }
    vector<string> letterCombinations(string digits) {
        if(digits.size() == 0) {
            return result;
        }
        backtacking(digits, 0);
        return result;
    }
};
相关推荐
vibecoding日记4 小时前
双非如何快速入职字节等大厂大模型?真实案例分析:推理优化和投机解码
算法·求职·大模型工程师
yszaygr21387 小时前
Verilog参数化游程编码RLE模块
算法
望易7 小时前
刚设计的大模型架构-双域耦合认知框架
算法·架构
复杂网络11 小时前
多个 Claude Code 与多个 Codex 协同工作:设计与实现方案
算法
apocelipes1 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
HjhIron1 天前
面试常客:字符串算法从入门到进阶
算法·面试
吴佳浩1 天前
DeepSeek DSpark:Confidence-Scheduled Speculative Decoding 技术解析
人工智能·算法·deepseek
触底反弹1 天前
🧠 搞懂 Token,才算真正入门大模型——从分词原理到 Embedding 语义实战
javascript·人工智能·算法
vivo互联网技术1 天前
ICLR 2026 | 基于后验采样的图像恢复方法LearnIR:人脸去阴影、去雾
人工智能·算法·aigc