代码随想录的第二十二天(回溯算法)

83 阅读1分钟

代码随想录的第二十二天(回溯算法)

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、遍历循环的条件:需要遍历的其实就是传入的字符串的每个字符对应的映射