回溯算法:解决组合、子集、切割、棋盘、排列问题
77. 组合
解题思路
代码实现
var combine = function(n, k) {
var result =[];
var path=[];
var backtracking = function(n,k,startIndex){
if(path.length === k){
result.push([...path]);
return;
}
for(let i=startIndex;i<=n;i++){
path.push(i);
backtracking(n,k,i+1);
path.pop();
}
}
backtracking(n,k,1);
return result;
};
216.组合总和III
解题思路
代码实现
var combinationSum3 = function(k, n) {
var result =[];
var path =[];
var sum = 0;
var backtracking = function(k, n, startIndex){
if(path.length ==k && sum === n){
result.push([...path]);
return;
}
for(let i=startIndex;i<=9;i++){
path.push(i);
sum +=i;
backtracking(k,n,i+1);
var res = path.pop();
sum -= res;
}
}
backtracking(k, n, 1);
return result;
};
17.电话号码的字母组合
解题思路
代码实现
var letterCombinations = function(digits) {
var arr = [[],[],['a','b','c'],['d','e','f'],['g','h','i'],['j','k','l'],['m','n','o'],['p','q','r','s'],['t','u','v'],['w','x','y','z']];
var res =[];
if(digits.length ===0){
return res;
}
var len = digits.length;
var str = '';
var backtracking= function(digits,len,startIndex){
if(str.length === len){
res.push(str);
return;
}
for(let i= startIndex; i<len;i++){
var idx = digits[i] * 1;
for(let j=0;j<arr[idx].length;j++){
str+=arr[idx][j];
// 不是 startIndex +1 而是 i+ 1
backtracking(digits,len,i+1);
str = str.slice(0,str.length-1);
}
}
}
backtracking(digits,len,0);
return res;
};