Day 25[补档] |● 216.组合总和III● 17.电话号码的字母组合

文章介绍了两个编程问题的解决方案:利用回溯法寻找k个元素之和等于目标值的组合(组合总和III),以及生成电话号码的所有可能字母组合。通过递归和边界条件控制搜索过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

216.组合总和III

class Solution {
public:
    void func(int k, int sum, int target, int st){
        if(path.size() == k){
            if(sum == target){
                res.push_back(path);
                return;
            }
            return;
        }
        for(int i = st; i <= 9; i++){
            if(sum + i > target) break;
            sum += i;
            path.push_back(i);
            func(k,sum,target,i+1);
            sum -= i;
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        func(k,0,n,1);
        return res;
    }
private:
    vector<int> path;
    vector<vector<int>> res;
};

思考过程:

        先找边界条件,当子答案vector的数量达到k时候,就需要对其进行检测了,要么其符合n加入答案,要么其不等于n,也要退出。

        而下面回溯就比较常规,因为不选相同的元素,则后续递归过程,每次的st值是从当前遍历i的下一个开始.

17.电话号码的字母组合

class Solution {
public:
    vector<string> map = {
        "",
        "",
        "abc",
        "def",
        "ghi",
        "jkl",
        "mno",
        "pqrs",
        "tuv",
        "wxyz"
    };
    void func(string digits, int st){
        if(path.size() == digits.size()){
            res.push_back(path);
            return;
        }
        int One_size = map[digits[st] - '0'].size();
        for(int i = 0; i < One_size; i++){
            path += map[digits[st]-'0'][i];
            func(digits,st+1);
            path.erase(path.size()-1);
        }
    }
    vector<string> letterCombinations(string digits) {
        if(digits.size() == 0) return res;
        func(digits,0);
        return res;
    }
private:
    string path;
    vector<string> res;
};

具体思路:

        首先是通过一个vector映射每个数字对应的string,其可看作是一个二维数组。之后搞清楚每一层递归,每一层是什么东西。

        从开始到结尾,每一层依次就是对应数字所对应的string。

既然搞清楚每一层代表什么,那么for遍历数层遍历的就是当前数字下的所有字符,而递归递的就是下一个数字的字符串,一层层往下直到return。        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值