(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;
    }
};
相关推荐
charlie1145141919 小时前
现代C++工程:constexpr 基础:编译期求值的艺术
开发语言·c++
小欣加油9 小时前
leetcode121买卖股票的最佳时机
数据结构·c++·算法·leetcode·职场和发展
牛油果子哥q9 小时前
【C++运算符重载】C++运算符重载终极精讲:单目/双目/关系/赋值运算符重载、成员与全局重载、重载禁区、底层原理与企业级工程规范
开发语言·c++
2601_961845159 小时前
2026四级作文预测题|英语四级写作押题+提纲PDF
java·c语言·数据库·c++·python·pdf·php
郝亚军9 小时前
Visual Studio 2022项目中的.sln是什么?
c++·c#·visual studio
暖阳华笺9 小时前
【高频考点】K-Means聚类算法
c++·算法·机器学习·kmeans·聚类
下午写HelloWorld9 小时前
后量子密码算法:协同签名研究综述
算法·密码学·后量子·协同签名
小蒋学算法10 小时前
算法-计算右侧小于当前元素的个数-分治&归并思想
java·数据结构·算法
lqqjuly10 小时前
FlashAttention 深度解析
人工智能·深度学习·算法
满怀冰雪10 小时前
第05篇-滑动窗口算法-一套模板解决子串与子数组问题
java·算法