代码随想录 DAY25 216.组合总和III 17.电话号码的字母组合

216.组合总和III

和77的写法一样,只不过多加了一个判断条件

class Solution {
private:
    vector> result;
    vector path;
    void transfer(int n,int k,int start,int sum){
        if(path.size()==k&&sum==n){
            result.push_back(path);
            return ;
        }

        //i <= 9 - (k - path.size()) + 1
        for(int i=start;i<=9;i++){
            sum+=i;
            path.push_back(i);
            transfer(n,k,i+1,sum);
            sum-=i;
            path.pop_back();
        }
    }

public:
    vector> combinationSum3(int k, int n) {
        result.clear();
        path.clear();
        int start=1;int sum=0;
        transfer(n,k,start,sum);
        return result;
    }
};

剪枝操作

1、sum>n 不用继续递归了

2、path中的个数超出k

class Solution {
private:
    vector> result;
    vector path;
    void transfer(int n,int k,int start,int sum){
        if(sum>n){
            return ;
        }

        if(k==path.size()){
            if(sum==n){
                result.push_back(path);return;
            }
        }

        for(int i=start;i<=9 - (k - path.size()) + 1;i++){
            sum+=i;
            path.push_back(i);
            transfer(n,k,i+1,sum);
            sum-=i;
            path.pop_back();
        }
    }

public:
    vector> combinationSum3(int k, int n) {
        result.clear();
        path.clear();
        int start=1;int sum=0;
        transfer(n,k,start,sum);
        return result;
    }
};

17.电话号码的字母组合

只是将数字的组合转换为数字代表的字母组合

也只是改结束条件和回溯范围

class Solution {
    private:
    const string letterMap[10] = {
        "", // 0
        "", // 1
        "abc", // 2
        "def", // 3
        "ghi", // 4
        "jkl", // 5
        "mno", // 6
        "pqrs", // 7
        "tuv", // 8
        "wxyz", // 9
    };
public: 
    string path;
    vector result;
    //start代表走到了digit的哪一个数字上
    void transfer(string &digits,int start){
        if(start==digits.size()){
            result.push_back(path);
            return;
        }

        int num=digits[start]-'0';
        string letters=letterMap[num];
        //分别遍历digit的字母
        for(int i=0;i letterCombinations(string digits) {
         result.clear();
        path.clear();
         if (digits.size() == 0) {
            return result;
        }
        int start=0;
        transfer(digits,start);
        return result;
    }
};

你可能感兴趣的:(算法,leetcode,c++,数据结构)