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 res = [], sum = 0, path = [];
const backtracking = function(k, n, startIndex) {
if(sum === n && path.length === k) {
res.push([...path]);
return;
}
for(let i = startIndex; i < 10; i++) {
path.push(i); sum += i;
backtracking(k, n, i+1);
path.pop(); sum -= i;
}
}
backtracking(k, n, 1);
return res;
};
17.电话号码的字母组合
本题大家刚开始做会有点难度,先自己思考20min,没思路就直接看题解。
题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
1- 2-abc 3-def
4-ghi 5-jkl 6-mno
7-pqrs 8-tuv 9-wxyz
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
答案
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function(digits) {
if (!digits.length) return [];
const lettersMap = [
'',
'',
'abc',
'def',
'ghi',
'jkl',
'mno',
'pqrs',
'tuv',
'wxyz'
]
const res = [], path = []
// index 指的是遍历的深度
const backtracking = function(index) {
if(index === digits.length) {
res.push(path.join(''));
return;
}
const digit = digits[index], letters = lettersMap[digit];
for(let i = 0; i < letters.length; i++) {
path.push(letters[i]);
backtracking(index + 1);
path.pop();
}
}
backtracking(0);
return res;
};