(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;
    }
};
相关推荐
c238566 分钟前
C/C++每日一练6
c语言·c++·算法
念恒1230635 分钟前
网络基础
linux·网络·c++
AI小码37 分钟前
把动作「画」给视频世界模型,跨本体双向推演,李飞飞参与
大数据·人工智能·算法·ai·大模型·音视频·编程
mct1231 小时前
c++ iconv 字符utf-8转换gb2312失败
开发语言·c++
ziguo11221 小时前
Windows API 文件操作超级指南——从入门到内核
c++·windows·visualstudio
KaMeidebaby2 小时前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法
alphaTao2 小时前
LeetCode 每日一题 2026/7/20-2026/7/26
算法·leetcode
zhangfeng11333 小时前
Ascendc 大语言模型框架 AscendCraft 和pypto 的区别 pypto生成算子c++源码吗
c++·人工智能·语言模型·算子开发
一只小灿灿3 小时前
C++ 修饰符全面详解
开发语言·c++
圣保罗的大教堂3 小时前
leetcode 3514. 不同 XOR 三元组的数目 II 中等
leetcode