216. 组合总和 III
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9
每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。
/**
* @param {number} k
* @param {number} n
* @return {number[][]}
*/
var combinationSum3 = function(k, n) {
let startIndex = 1;
let result = [];
let path = [];
let sum = 0;
var backTraing = function(k,n,startIndex,sum){
let arr = [...path];
if (arr.length == k) {
if(sum == n){
result.push(arr);
}
return;
}
for(let i = startIndex;i<= 9-(k-path.length)+1;i++){ //剪枝优化
sum += i;
path.push(i);
if (sum > n) {
// 和已经大于目标值,终止遍历,跳出循环,
sum -= i;
path.pop();
return;
}
backTraing(k,n,i+1,sum);
path.pop();
sum -= i;
}
}
backTraing(k,n,startIndex,sum);
console.log(result);
return result;
};
combinationSum3(9,45);
17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function(digits) {
if(digits.length == 0){
return [];
}
let arr = ["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"];
let result = [];
let path = [];
let startIndex = 0;
var back = function(startIndex){
if(path.length === digits.length){
result.push([...path].join(''));
return;
}
let comb = arr[digits[startIndex]-"0"]; //当前数字对应的字符串
for(let i = 0;i<comb.length;i++){
path.push(comb[i]);
back(startIndex+1);
path.pop(comb[i]);
}
}
back(startIndex);
return result;
};