本题要找出相加之和为n的k个数的组合,这和上一篇的组合问题大同小异,也是运用回溯算法和递归相结合,在终止条件中要加上计算数组里的元素和这一操作,并且在剪枝操作中变为确定元素和是否大于n,若大于n则直接剪枝。
具体代码如下:
class Solution {
public:
vector<int>tmp;
vector<vector<int>>result;
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k,n,1,9);
return result;
}
void backtracking(int k,int n,int start,int end)
{
int sum=0;
for(int i=0;i<tmp.size();i++)
{
sum+=tmp[i];
}
if(sum>n)
{
return;
}
if(sum==n&&tmp.size()==k)
{
result.push_back(tmp);
return;
}
for(int i=start;i<=end;i++)
{
tmp.push_back(i);
backtracking(k,n,i+1,end);
tmp.pop_back();
}
}
};
本题将2-9的数字映射为不同的字符串,也是将回溯算法和递归结合,基本思路与上题一致,不同之处在于加上了数字和字符串之间的映射,这使得二者之间要不停转变。首先构建string数组将数组和字符串对应起来,在递归过程中用index表示传入字符串的下标,通过对字符串下标对应数字的处理也处理了数字对应的不同字母将其进行组合,最后当访问字符串下标到最后一个字符之后时结束递归返回结果。
具体代码如下:
class Solution {
public:
string st;
vector<string>result;
string mapletter[10]=
{
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz",
};
vector<string> letterCombinations(string digits) {
if(digits.length()==0)
{
return result;
}
backtracking(digits,0);
return result;
}
void backtracking(string digits,int index)
{
if(index==digits.length())
{
result.push_back(st);
return;
}
int digit=digits[index]-'0';
string map=mapletter[digit];
for(int i=0;i<map.length();i++)
{
st.push_back(map[i]);
backtracking(digits,index+1);
st.pop_back();
}
}
};
本文讲述了如何使用回溯算法和递归来解决LeetCode中的第216题(找出k个数之和等于n的组合)和第17题(将2-9数字映射为字符串的组合)。两题都涉及到递归过程和剪枝策略的运用。
1258

被折叠的 条评论
为什么被折叠?



