216.组合总和III
class Solution {
public:
void func(int k, int sum, int target, int st){
if(path.size() == k){
if(sum == target){
res.push_back(path);
return;
}
return;
}
for(int i = st; i <= 9; i++){
if(sum + i > target) break;
sum += i;
path.push_back(i);
func(k,sum,target,i+1);
sum -= i;
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
func(k,0,n,1);
return res;
}
private:
vector<int> path;
vector<vector<int>> res;
};
思考过程:
先找边界条件,当子答案vector的数量达到k时候,就需要对其进行检测了,要么其符合n加入答案,要么其不等于n,也要退出。
而下面回溯就比较常规,因为不选相同的元素,则后续递归过程,每次的st值是从当前遍历i的下一个开始.
17.电话号码的字母组合
class Solution {
public:
vector<string> map = {
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
};
void func(string digits, int st){
if(path.size() == digits.size()){
res.push_back(path);
return;
}
int One_size = map[digits[st] - '0'].size();
for(int i = 0; i < One_size; i++){
path += map[digits[st]-'0'][i];
func(digits,st+1);
path.erase(path.size()-1);
}
}
vector<string> letterCombinations(string digits) {
if(digits.size() == 0) return res;
func(digits,0);
return res;
}
private:
string path;
vector<string> res;
};
具体思路:
首先是通过一个vector映射每个数字对应的string,其可看作是一个二维数组。之后搞清楚每一层递归,每一层是什么东西。
从开始到结尾,每一层依次就是对应数字所对应的string。
既然搞清楚每一层代表什么,那么for遍历数层遍历的就是当前数字下的所有字符,而递归递的就是下一个数字的字符串,一层层往下直到return。