一、216 组合总和III
思路:在组合的基础上加上数组和的判断,具体的细节见代码
代码:
var combinationSum3 = function(k, n) {
var result = [];
var backtracking = function(startNum, path) {
var sum = 0;
for (let i=0; i<path.length; i++) {
sum += path[i];
}
// 如果小于k的长度的时候已经比n大了,就直接退出
if (sum > n) {
return;
}
if (sum === n && path.length === k) {
result.push(path.slice(0));
}
for (let i=startNum; i<=9 - (k - path.length) + 1; i++) {
path.push(i);
backtracking(i+1, path);
path.pop();
}
}
backtracking(1, []);
return result;
};
二、17 电话号码的字母组合
思路:这道题需要明白的是,每次横向for循环遍历的是每个数字所包含的字母个数,需要考虑到的是7和9的特殊性,需要遍历四次。想到的转换方法是使用ASCII码,用原来a的ASCII码作为基准,然后加上一定的数值再转换。也可以定义一个数组,然后就不需要判断time,而是直接用数组的长度就可以,也是一样的。
代码:
var letterCombinations = function(digits) {
var result = [];
var arr = Array.from(digits);
if (arr.length == 0) {
return result;
}
var backtracking = function(index, path) {
if (path.length == digits.length) {
result.push(path.join(''));
return;
}
var digit = parseInt(arr[index]);
// 正常横向需要遍历三个,而7和9需要遍历四个
var time = 3;
if (digit == 9 || digit == 7) {
time = 4;
}
for (let i=0;i<time;i++) {
var code = (digit-2)*3 + 'a'.charCodeAt() + i;
if (digit > 7) {
// 因为7多了一个数字,所以8和9要往后串一位
code += 1;
}
path.push(String.fromCharCode(code));
backtracking(index + 1, path);
path.pop();
}
}
backtracking(0, []);
return result;
};
今日学习时长:1h左右
总结:今天两道题都做出来了,开心,感觉在慢慢了解回溯法的写法,17题想复杂了一些,可以直接使用数字为索引的数组,这样就可以少一些判断条件。下次刷的时候再看17题。