代码随想录的第二十二天(回溯算法)
216. 组合总和 III
var combinationSum3 = function(k, n) {
const result = []
const path = []
function backTracking (k, n, startIndex) {
if (path.length === k) {
let sum = 0;
for (let i = 0; i < path.length; i++) {
sum += path[i]
}
if (sum === n) {
result.push([...path])
}
return
}
for (let i = startIndex; i <= 9; i++) {
path.push(i)
backTracking(k, n, i + 1)
path.pop()
}
}
backTracking(k, n, 1)
return result
};
思路:
1、定义两个数组,一个用来放置最终的结果,还有一个用来放置当前的数组
2、当满足个数和总和的条件时,进行push,终止操作
3、遍历数组然后往当前数组中push值,进行递归,去进行条件的匹配,匹配到之后将数组抛出
17. 电话号码的字母组合
var letterCombinations = function(digits) {
let leng = digits.length
if (!leng) return []
const map = ["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"];
if (leng === 1) return map[digits].split('')
let result = [], path = []
function backTracking (digits, leng, index) {
if (path.length === leng) {
result.push(path.join(''))
return
}
for (const v of map[digits[index]]) {
path.push(v)
backTracking(digits,leng,index + 1)
path.pop()
}
}
backTracking(digits, leng, 0)
return result
};
思路:
1、上面的减枝就不说了,主要看回溯部分
2、还是定义一个最终结果集,和一个放置当前数组的path
3、首先要先明白遍历的深度就是传入的字符串的长度,即终止条件就是当前数组等于传入字符串的长度终止
4、遍历循环的条件:需要遍历的其实就是传入的字符串的每个字符对应的映射