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

216. 组合总和 III

题目|文章
image

思路

这道题是一道典型的组合问题,套用回溯模板进行考虑。

  1. 考虑参数和返回值。
    很明显,返回值为void,参数包括n,k。因为要判断相加之和,需要一个参数sum记录当前组合的总和,此外我们还需要一个参数startIndex来控制回溯。
    void backTracking(const int& n, const int& k, int startIndex)
  2. 考虑终止条件。
  • sum == n时,将路径加入结果并返回。
  • sum > n时,直接返回。
  1. 单次循环逻辑。
    从startIndex开始进行遍历。
    for(i = startIndex; i <= 9; i++)
    题中要求每个数字只能使用一次,因此将i+1作为新的startIndex传递。
  2. 剪枝
    可以对遍历过程进行剪枝。当数组中剩余元素不足时,不再遍历。
    i <= 9 - (k - path.size() + 1)

实现

点击查看代码
class Solution {
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        traversal(n, k, 1, 0);
        return result;
    }
    vector<int> path;
    vector<vector<int>> result;
    void traversal(int& n, int& k, int startIndex, int sum) {
        if(sum > n) return;
        if(path.size() == k) {   
            if(sum == n) {
                result.push_back(path);
            }
            return;
        }
        for(int i = startIndex; i <= 9 - (k-path.size()) + 1; i++) {
            path.push_back(i);
            traversal(n, k, i+1, sum+i);
            path.pop_back();
        }
    }
};

17. 电话号码的字母组合

题目|文章

思路

1.题目的难点在于如何将数字映射到字母,有两种方法,数组和map。
实现之后这道题将会迎刃而解。

实现

点击查看代码
class Solution {
public:
    vector<string> letterCombinations(string digits) {
        if(digits.size() == 0) return result;
        traversal(digits,0,path);
        return result;
    }
private:
    const string phone[12] = {
        "",
        "",
        "abc",
        "def",
        "ghi",
        "jkl",
        "mno",
        "pqrs",
        "tuv",
        "wxyz",
        "",
        "",
    };
    string path;
    vector<string> result;
    void traversal(string& digits, int count, const string& path) {
        if(path.size() == digits.size()) {
            result.push_back(path);
            return;
        }
        int digit = digits[count] - '0';
        string letter = phone[digit];
        for(int i = 0; i < letter.size(); i++) {         
            traversal(digits, count+1, path+letter[i]);
        }
    }
};
posted @ 2022-10-28 20:25  缩地  阅读(29)  评论(0)    收藏  举报