Day22: 回溯基础 |

回溯算法模板框架如下:

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

第77题. 组合 (需要回看)

每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围

图中可以发现n相当于树的宽度,k相当于树的深度

那么如何在这个树上遍历,然后收集到我们要的结果集呢?

图中每次搜索到了叶子节点,我们就找到了一个结果

题目:

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。

示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]

function combine(n: number, k: number): number[][] {
    let resArr: number[][] = [];
    function backtracking(start: number, result: number[]) {
        if (result.length === k) {
            results.push([...result]);
            return;
        }
        for (let i = start; i <= n; i++) {
            result.push(i);
            backtracking(i + 1, result);
            result.pop();
        }
    }
    backtracking(1, []);
    return results;
};

216.组合总和III

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

  • 所有数字都是正整数。
  • 解集不能包含重复的组合。

示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]]

示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]

function combinationSum3(k: number, n: number): number[][] {
    let results: number[][] = [];
    function backtracking(start: number, result: number[], sum: number){
        if(result.length > k){
            return;
        }
        if(sum === n && result.length === k){
            results.push([...result]);
            return;
        }
        for(let i = start; i <= 9; i++){
            if(sum + i > n){
                return;
            }
            result.push(i);
            backtracking(i + 1, result, sum + i);
            result.pop();
        }
    }
    backtracking(1, [], 0);
    return results;
};

17.电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例:

  • 输入:"23"
  • 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

const LetterByNumber = {
    '2': ['a', 'b', 'c'],
    '3': ['d', 'e', 'f'],
    '4': ['g', 'h', 'i'],
    '5': ['j', 'k', 'l'],
    '6': ['m', 'n', 'o'],
    '7': ['p', 'q', 'r', 's'],
    '8': ['t', 'u', 'v'],
    '9': ['w', 'x', 'y', 'z'],
}

function letterCombinations(digits: string): string[] {
    let results = [];
    function backtracking(start: number, result: string[]){
        if (result.length === digits.length) {
            if(result.length !== 0) results.push(result.join(''));
            return;
        }
        for (let i of LetterByNumber[digits[start]]) {
            result.push(i);
            backtracking(start + 1, result);
            result.pop();
        }
    }
    backtracking(0, []);
    return results;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值