day25打卡
216. 组合总和 III
- 画出决策树
- 递归出口:path.size() == k
- 子问题:从pos开始枚举每个数字
- 剪枝:count 提前大于 n,返回即可
- 时间复杂度:O(N * 2^N),空间复杂度:O(N)
class Solution {
public:vector<vector<int>> ret;vector<int> path;int count = 0;vector<vector<int>> combinationSum3(int k, int n) {dfs(k, n, 1);return ret;}void dfs(int k, int n, int pos){//剪枝if(count > n) return;//出口if(path.size() == k){if(count == n) ret.push_back(path);return;}//子问题for(int i = pos; i <= 9; i++){path.push_back(i);count += i;dfs(k, n, i+1);//回溯path.pop_back();count -= i;}}
};
17. 电话号码的字母组合
- 画出决策树
- 递归出口:pos等于digits.size()
- 子问题:从digits[0]开始枚举每个字母,直到hash[digits[pos] - ‘0’].szie()
class Solution {
public:vector<string> ret;string path = "";string hash[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};vector<string> letterCombinations(string digits) {if(digits.size() == 0) return ret;dfs(digits, 0);return ret;}void dfs(string& digits, int pos){//出口if(pos == digits.size()){ret.push_back(path);return;}//子问题for(int i = 0; i < hash[digits[pos] - '0'].size(); i++){path += hash[digits[pos] - '0'][i];dfs(digits, pos + 1);//回溯path.pop_back();}}
};
pos + 1);
//回溯
path.pop_back();
}
}
};