day25打卡
- 画出决策树
- 递归出口: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;
}
}
};
- 画出决策树
- 递归出口: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();
}
}
};