首页 > 编程语言 >代码随想录算法训练营第第24天 | 回溯法、77.组合问题

代码随想录算法训练营第第24天 | 回溯法、77.组合问题

时间:2024-05-31 22:32:57浏览次数:14  
标签:24 剪枝 随想录 number 77 算法 let 回溯 path

一、回溯法

  • 回溯法是一种搜索方式,也是递归的副产品。只要有递归就会有回溯
  • 回溯法并不是什么高效的算法。因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,
    如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。
  • 回溯法,一般可以解决如下几种问题:
    1. 组合问题:N个数里面按一定规则找出k个数的集合
    2. 切割问题:一个字符串按一定规则有几种切割方式
    3. 子集问题:一个N个数的集合里有多少符合条件的子集
    4. 排列问题:N个数按一定规则全排列,有几种排列方式
    5. 棋盘问题:N皇后,解数独等等
      回溯算法模板框架如下:
void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

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

二、77.组合问题
77. 组合

对着 在 回溯算法理论基础 给出的 代码模板,来做本题组合问题,大家就会发现 写回溯算法套路。
在回溯算法解决实际问题的过程中,大家会有各种疑问,先看视频介绍,基本可以解决大家的疑惑。
本题关于剪枝操作是大家要理解的重点,因为后面很多回溯算法解决的题目,都是这个剪枝套路。

题目链接/文章讲解:https://programmercarl.com/0077.组合.html
视频讲解:https://www.bilibili.com/video/BV1ti4y1L7cv
剪枝操作:https://www.bilibili.com/video/BV1wi4y157er

未剪枝版
/**
 * @param {number} n
 * @param {number} k
 * @return {number[][]}
 */
var combine = function(n, k) {
    let res = [];
    let path = [];
    const backtracking = (n, k, startIndex)=>{
        if (path.length === k) {
            res.push([...path]);
            return;
        }
        for (let i= startIndex; i<=n; i++) {
            path.push(i);
            backtracking(n, k, i+1);
            path.pop(i);
        }
    }
    backtracking(n, k, 1);
    return res;
};
剪枝版
/**
 * @param {number} n
 * @param {number} k
 * @return {number[][]}
 */
var combine = function(n, k) {
    let res = [];
    let path = [];
    const backtracking = (n, k, startIndex)=>{
        if (path.length === k) {
            res.push([...path]);
            return;
        }
        for (let i= startIndex; i<=n-(k-path.length)+1; i++) {
            path.push(i);
            backtracking(n, k, i+1);
            path.pop(i);
        }
    }
    backtracking(n, k, 1);
    return res;
};

标签:24,剪枝,随想录,number,77,算法,let,回溯,path
From: https://www.cnblogs.com/yuanyf6/p/18225366

相关文章

  • Ubuntu server 24 (Linux) Snort3 3.2.1.0 Guardian IPtables 联动实战 主动防御系统(
    一  Snort3安装配置,参考:Ubuntuserver24安装配置snort33.2.1.0网络入侵检测防御系统配置注册规则集-CSDN博客二  安装主动防御程序Guardian1下载,解压tarzxvfguardian-1.7.tar.gzcdguardian-1.7/2 配置#拷贝文件sudocpguardian.pl/usr/local/bin/......
  • 24-5-18 X
    自3月31号回来之后,这两个月像是失去了方向一般,对很多事都提不起兴趣。今天和X聊了聊,他还是以前那个熟悉的样子。高中的时候,他是我们班里公认的第一,我们是普通班,但他有着实验班的实力,事实上,高考时他全校第三,后来去了美国留学。他不仅学习好,而且兴趣广泛,和他相处,总能够让我......
  • 【2024-05-30】销售能力
    20:00人类最宝贵的财富是希望,希望减轻了我们的苦恼,为我们在享受当前的乐趣中描绘出来乐趣的远景。                                ——伏尔泰今天下午公司来了一个客人,她不是来找我的,是找我们公司财务总......
  • 代码随想录算法训练营第四十五天 | 1049. 最后一块石头的重量 II、494. 目标和、474.
    1049.最后一块石头的重量II视频讲解:动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II_哔哩哔哩_bilibili代码随想录解题思路直接将这一些石头,分为两堆,让他们尽可能相似,然后再相撞,就是最小值1.dp[j]背包容量为j所背的最大价值2.dp[......
  • Centos7对比Ubuntu24一些常用操作差异点
    Centos7对比Ubuntu一些常用操作差异点CentOS7将于2024年6月30日停止维护,CentOS8已经转为Rhel的上游项目。同时Centos7的软件仓库中,部分软件版本较老。后续使用过程中可以考虑切换到Ubuntu。下面总结了一些两个系统的常见差异点,包括软件包管理、防火墙管理和网络配置等。功......
  • 代码随想录算法训练营day10(栈与队列)
    代码随想录算法训练营day10(栈与队列):学习内容:std::queue和std::stack是C++标准库中提供的队列和栈的容器适配器,它们分别基于队列和栈的概念,提供了一组简单的操作接口。std::queuestd::queue是一个先进先出(FIFO)的队列容器适配器。它提供了队列的基本操作,包括入队(pus......
  • ICDE’24|中国企业首获最佳论文,详解PolarDB Serverless如何在0.5秒内实现跨机迁移
    以下文章来源于阿里云开发者作者陈浩、章颖强引言数据库领域顶会ICDE2024于5月13-17日在荷兰乌特勒支(Utrecht,Netherlands)举办。ICDE(TheInternationalConferenceonDataEngineering) 与VLDB、SIGMOD被公认为是国际数据管理领域三大顶级学术会议,此次在荷兰召开......
  • 工程管理软件哪个好?2024年10个最佳工程管理软件
    本文将分享10款工程管理软件:PingCode、Worktile、Wrike、Asana、Monday.com、AdobeWorkfront、Smartsheet、Jira、ClickUp、MicrosoftProject。在高速发展的建筑和工程行业,管理复杂的项目要求极高的精确性和效率。工程管理软件在这一领域发挥着至关重要的作用,它通过提供详细......
  • P10550 [THUPC2024] 贸易
    MyBlogsP10550[THUPC2024]贸易首先可以观察到,对于每种颜色,括号匹配(把\(0\)看成左括号,\(1\)看成右括号)一定是最优的。所以可以先找出所有匹配\([x,y]\),然后问题变成给定\([l,r]\),求有多少个\([x,y]\subseteq[l,r]\),离线做一遍扫描线,树状数组维护即可。 intn,m,a[50001......
  • 电源电路E24系列反馈电阻计算表格
    可调电源,包括DCDC、LDO电路的设计中,经常需要计算反馈电阻进行选型。为了提高效率,优化选型采购,抽空做了个表格进行快速计算。1.一般反馈电阻电路如下。输出电压公式为:Vout=Vfb*(Rh+Rl)/Rl2.E24电阻标准电阻值被组织成一组称为E系列的值。E系列优选或标准电阻值范围是国际公认......