代码随想录算法训练营第二十五天| 216.组合总和III、17.电话号码的字母组合
216. 组合总和Ⅲ
题目链接:216. 组合总和 III - 力扣(LeetCode)
思路: 跟求排列相差无几,记得把sum加的减回来。
class Solution {
public:
void backtracking(std::vector<int> &ans, std::vector<std::vector<int>> &arr,int startIndex,int &sum,int &k,int &n){
if(ans.size() == k ){
if(sum == n){
arr.push_back(ans);
return;
}else if(sum>n) return;
}
for(int i = startIndex;i<10&& sum+i<=n;i++){
sum += i;
ans.push_back(i);
backtracking(ans,arr,i+1,sum,k,n);
ans.pop_back();
sum-=i;
}
}
std::vector<std::vector<int>> combinationSum3(int k, int n) {
int sum = 0;
std::vector<int> ans;
std::vector<std::vector<int>> arr;
backtracking(ans,arr,1,sum,k,n);
return arr;
}
};
17. 电话号码的字母组合
题目链接:17. 电话号码的字母组合 - 力扣(LeetCode)
class Solution {
public:
std::vector<std::string> tele = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
void backtracking(std::vector<std::string> &arr,std::string s,int startIndex,std::string &digits){
if(startIndex == digits.size()){
arr.push_back(s);
return;
}
int num = digits[startIndex]-'0';// 对应的数字
std::string sFor = tele[num];// 数字对应的字符串
for(int i = 0;i<sFor.size();i++){
backtracking(arr,s+sFor[i],startIndex+1,digits);
}
}
std::vector<std::string> letterCombinations(std::string digits) {
std::vector<std::string> arr;
if(digits.size() ==0) return arr;
backtracking(arr,"",0,digits);
return arr;
}
};