算法训练1-day19-回溯

29 阅读1分钟

回溯法来了

  1. 77. 组合 注意使用全局变量来减少递归栈的使用,顺带加快速度 AC代码:
class Solution {
public:
    vector<vector<int>> ans;
    vector<int> path;
    vector<vector<int>> combine(int n, int k) {
        ans.clear();
        path.clear();
        _combine(n, k, 1);
        return ans;
    }
    void _combine(int n, int k, int startIndex) {
        if (path.size() == k) {
            ans.push_back(vector<int>(path.begin(), path.end()));
            return;
        }
        for (int i = startIndex; i <= n; ++i) {
            path.push_back(i);
            _combine(n, k, i + 1);
            path.pop_back();
        }
    }
};
  1. 216. 组合总和 III

AC代码:

class Solution {
public:
    const int MAX_NUMBER = 9;
    vector<vector<int>> ans;
    vector<int> path;
    vector<vector<int>> combinationSum3(int k, int n) {
        path.reserve(k);
        backtracing(k, n, 1);
        return ans;
    }
    void backtracing(int k, int n, int startIndex) {
        if (path.size() == k && n == 0) {
            ans.push_back(path);
            return;
        }
        for (int i = startIndex; i <= MAX_NUMBER; ++i) {
            if (n - i < 0) break;
            path.push_back(i);
            backtracing(k, n - i, i + 1);
            path.pop_back();
        }
    }
};
  1. 17. 电话号码的字母组合

代码如下:

class Solution {
public:
    vector<string> numberToString = {"abc", "def",  "ghi", "jkl",
                                     "mno", "pqrs", "tuv", "wxyz"};
    vector<string> res;
    string combine;
    vector<string> letterCombinations(string digits) {
        combine = "";
        backtracing(digits, 0);
        return res;
    }

    void backtracing(string& digits, int pos) {
        if (pos >= digits.size()) {
            res.push_back(combine);
            return;
        }

        int number = digits[pos] - '0'; // 2-9
        for (char c : numberToString[number - 2]) {
            combine.push_back(c);
            backtracing(digits, pos + 1);
            combine.pop_back();
        }
    }
};