思路:
本题跟昨天的求组合问题存在异曲同工,只是需要再数字1~9中找出K个数,来使其满足其和等于n
1、书写终止条件,存在两种情况
sum值等于n,且当前数组的数组大小也等于k,说明符合条件
if (sum == n && midvary.size() == k)//如果当前sum值和midvary的大小都符合,那就将其插入需要返回的result中
{
result.push_back(midvary);
return;//这里的返回,是防止不要往下面去了
}
2、若sum等于n,且数组大小不等于k,直接跳过,且当前大小等于k,也直接跳过,但是要返回,不能让其在往后面持续叠加。
if (midvary.size() == k)return;
3、开始回溯,对当前midvary进行加入数组,并且sum总值进行累加,然后递归,再一个个排除元素,和去掉值,回溯。
for (int i = startIndex; i < 10; i++)
{
midvary.push_back(i);
sum += i;
backtracking(midvary, k, n, sum, i + 1);
sum -= i;
midvary.pop_back();
}
整体代码如下:
class Solution {
private:
vector<vector<int>>result;
void backtracking(vector<int>&midvary,int k,int n,int &sum,int startIndex)//startIndex大小为1~9
{
if (sum == n && midvary.size() == k)//如果当前sum值和midvary的大小都符合,那就将其插入需要返回的result中
{
result.push_back(midvary);
return;//这里的返回,是防止不要往下面去了
}
if (midvary.size() == k)return;
for (int i = startIndex; i < 10; i++)
{
midvary.push_back(i);
sum += i;
backtracking(midvary, k, n, sum, i + 1);
sum -= i;
midvary.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n)
{
//回溯问题可以抽象为一个树形结构问题
//这里可以使用组合问题中的问题,相当于是对也是一个组合问题,组合出K个值,看其累加和是否相等
vector<int>midvary;
int sum = 0;
backtracking(midvary, k, n, sum, 1);
return result;
}
};
思路:
本题自己一直没把终止条件写好,导致一直在错误,因为一开始就需要判断加入的下标值是否等于digits的大小,如果等于,说明我需要进行一个加入了,若不满足则不用管,我一开始是判断若加入的值比他大,那么就直接返回,这样在后续的一个加入过程中,会将已经排好的结果数组,最终将其弹出为空。
思路便是,将其抽象为一层一层的树形结构,每层的树形结构便是对每一个数字对应的值进行一个遍历,依次遍历,一个一个往下遍历,这样最终结果也就出来了。
class Solution {
public:
//先弄一个数组
const string midvary[10] =
{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};//建立两个空的放在队头,方便后序直接调用其中的数组。
//string a = "123";
//int i = a[0] - '0';可通过对ASCII相减来求值
vector<string>result;
void backtracking(string digits, string& cur, int startIndex)
{
//if (startIndex >= digits.size())//当前加入的值要比digits的值都要小,一旦不满足就返回
//{
// return;
//}
if (startIndex == digits.size())//若临时变量cur的大小比digits都要小,那么就将其放入总数组,也就是结果中
{
result.push_back(cur);
return;
}
//int j = digits[i] - '0';//说明是第几个
int pre = digits[startIndex] - '0';
for (int k = 0; k < midvary[pre].size(); k++)//这里有一步是退出循环的。
{
cur.push_back(midvary[pre][k]);
backtracking(digits, cur, startIndex + 1);
cur.pop_back();
}
}
vector<string> letterCombinations(string digits)
{
string cur;
if (digits.size() == 0)return result;
backtracking(digits, cur, 0);
return result;
}
};