一、组合
第一次接触回溯是在二叉树章节,在这题里的回溯体现的更明显,而且思想更接近人平时思考问题的思想。思路是有的,但是转换成代码就有点困难了。
回溯三部曲第一步,确定参数(返回值通常为void):n,k,startindex(用于回溯的起点),第二步确定终止条件(让数组长度等于k时,返回数组)第三步:单次搜索:用for循环来从startindex开始遍历到题目给的n,每次加一个元素进去给数组,然后开始回溯加下一个数。
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void backtracking(int n,int k,int startindex){
if(path.size()==k){
result.push_back(path);
return;
}
for(int i=startindex;i<=n;i++){
path.push_back(i);
backtracking(n,k,i+1);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backtracking(n,k,1);
return result;
}
};
二、组合总和
思路没问题,在代码细节上需要注意一下:
1.回溯函数下面跟着的回溯过程要完成,不要漏情况了,比如说这题一开始自己写的时候就漏了sum-=i
2.for循环的起始条件要注意,因为习惯了写数组下标,直接就把第二个终止条件写成了<而忽略了本题需要<=的情况
3.要注意终止条件的判断条件,一开始写成了if size==k,sum==k push+return else直接return忽略了还没有满,添加元素的过程,导致永远填不满就return了
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void backtracking(int k,int n,int startindex,int sum){
// if(path.size()==k){
// if(sum==n)result.push_back(path);
// return;
// }
if(path.size()==k&&sum==n){
result.push_back(path);
return;
}else if(path.size()==k&&sum!=n)return;
for(int i=startindex;i<=9;i++){
path.push_back(i);
sum+=i;
backtracking(k,n,i+1,sum);
sum-=i;
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k,n,1,0);
return result;
}
};
三、电话号码字母组合
这个题一开始没想到的点就是怎么把数字和字母能映射起来,题解中所用的是字符串数组。要用一个index指示当前指向的第几个数字,用letter=list[index]来存放按键中的字母,然后用for循环在lettrer中遍历回溯
class Solution {
public:
vector<string>result;
string temp;
string list[10]={
"",//0
"",//1
"abc",//2
"def",//3
"ghi",//4
"jkl",//5
"mno",//6
"pqrs",//7
"tuv",//8
"wxzy",//9
};
void backtracking(const string &digits,int length,int index){
if(temp.size()==length){
result.push_back(temp);
return;
}
int digit=digits[index]-'0';
string letter=list[digit];
for(int i=0;i<letter.size();i++){
temp.push_back(letter[i]);
backtracking(digits,length,index+1);
temp.pop_back();
}
return;
}
vector<string> letterCombinations(string digits) {
if(digits.size()==0)return result;
int length=digits.size();
backtracking(digits,length,0);
return result;
};
};