美文网首页
代码随想录训练营Day24 | 77.组合

代码随想录训练营Day24 | 77.组合

作者: 是小张啊啊 | 来源:发表于2023-11-04 20:55 被阅读0次

    回溯算法基础总结

    • 往往是递归中包含着回溯,所以回溯函数即递归函数
    • 回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案
    • 可以解决如下几种问题
    1. 组合问题:N个数里面按一定规则找出k个数的集合
    2. 切割问题:一个字符串按一定规则有几种切割方式
    3. 子集问题:一个N个数的集合里有多少符合条件的子集
    4. 排列问题:N个数按一定规则全排列,有几种排列方式
    5. 棋盘问题:N皇后,解数独等等
    • 回溯法解决的问题都可以抽象成树型结构
      因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度
      递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)
    • 回溯算法模板
    void backtracking(参数) {
        if (终止条件) {
            存放结果;
            return;
        }
        for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
            处理节点;
            backtracking(路径,选择列表); // 递归
            回溯,撤销处理结果
        }
    }
    
    77. 组合
    思路
    • 集合长度为n,所以外层循环n次
    • 在循环中进行递归操作,递归终止条件则是找到了满足k大小的path数组


      image.png
    var combine = function(n, k) {
        let result = []
        let path = []
        const backtracking = (n, k, startIndex) => {
            if (path.length === k) {
                result.push([...path])
                return
            }
            for (let i = startIndex; i <= n; i++) {
                path.push(i)
                backtracking(n, k, i+1)
                path.pop() // 回溯 撤销处理的节点
            }
        }
        backtracking(n, k, 1)
        return result
    };
    

    剪枝优化

    • 如果for循环起始位置之后的元素个数已经不满足我们所需结果的长度,那么后面的元素就没有必要再继续循环了
    • 已经选择的元素个数:path.length
    • 结果还需要的元素个数: k - path.length
    • for循环还需要遍历的元素个数: n - i
    • 需要满足的条件:(n - i) >= (k - path.length),即:i <= n - (k-path.length)
    • 为什么需要+1,因为要包含起始位置也是可以的
    var combine = function(n, k) {
        let result = []
        let path = []
        const backtracking = (n, k, startIndex) => {
            if (path.length === k) {
                result.push([...path])
                return
            }
            for (let i = startIndex; i <= n - (k - path.length()) + 1; i++) {
                path.push(i)
                backtracking(n, k, i+1)
                path.pop()
            }
        }
        backtracking(n, k, 1)
        return result
    };
    

    相关文章

      网友评论

          本文标题:代码随想录训练营Day24 | 77.组合

          本文链接:https://www.haomeiwen.com/subject/iqnaidtx.html