216.组合总和III
思路:
本题k相当于树的深度,9(因为整个集合就是9个数)就是树的宽度。
例如 k = 2,n = 4的话,就是在集合[1,2,3,4,5,6,7,8,9]中求 k(个数) = 2, n(和) = 4的组合。
代码实现:
var combinationSum3 = function (k, n) {
let result = [];
let path = [];
const backTracking = (sum, n, k, startIndex) => {
if (sum > n) {// 剪枝操作
return
}
if (path.length === k) {
if (sum === n) {
result.push([...path])
return
}
}
for (let i = startIndex; i <= 9 - (k - path.length) + 1; i++) {
sum += i;
path.push(i)
backTracking(sum, n, k, i + 1)
sum -= i;
path.pop()
}
}
backTracking(0, n, k, 1);
return result
};
17.电话号码的字母组合
思路:
要解决如下三个问题:
- 数字和字母如何映射
- 两个字母就两个for循环,三个字符我就三个for循环,以此类推,然后发现代码根本写不出来
- 输入1 * #按键等等异常情况
代码实现
var letterCombinations = function (digits) {
const digLen = digits.length
const letterMap = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"];
if (!digLen) return [];
if (digLen === 1) return letterMap[digits].split("")
const res = [], path = [];
const backTracking = (n, k, a) => {
if (path.length === k) {
res.push(path.join(""));
return;
}
for (const v of letterMap[n[a]]) {
path.push(v);
backTracking(n, k, a + 1);
path.pop()
}
}
backTracking(digits, digLen, 0);
return res
};
总结
看完视频和文章后 感觉不是很困难,但还是很难靠自己想出来 继续加油吧!