算法训练营Day24(回溯)

什么问题要用回溯?

暴力都解决不了的问题

组合、排列、切割、子集、棋盘,这些问题

如何理解回溯法?

回溯法比较抽象、困难,采用图形可以帮助理解,解决问题

解决方式:抽象为一个树型结构

模板

void backtarcking(参数(做题的时候慢慢写)){

if(终止条件){

        收集结果。      

}

        //单层搜索逻辑

        for(遍历集合的元素集){

                处理节点;//13

                递归操作;

                回溯操作;//1(进行撤销3,方便下次组合成 12)

        }

}

组合

77. 组合 - 力扣(LeetCode)

本题关于剪枝操作是大家要理解的重点,因为后面很多回溯算法解决的题目,都是这个剪枝套路。 

对着 在 回溯算法理论基础 给出的 代码模板,来做本题组合问题,大家就会发现 写回溯算法套路。

相当于通过递归来代替好多层的for循环

答案:(注意path要回溯,在堆里变化的,要回溯,回溯完之后就都为null了,所以要new一个)

class Solution {private List<Integer> path = new ArrayList<>();private List<List<Integer>> result = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backingTracking(n,k,1);return result;}void backingTracking(int n,int k,int beginIndex){if(path.size()==k){//收割结果result.add(new ArrayList(path));return;}//单层递归逻辑//不是0开始,而是1for(int i = beginIndex;i<=n;i++){path.add(i);//递归backingTracking(n,k,i+1);//回溯path.removeLast();}}
}

剪枝优化

对上一道题做优化,并分析剪枝的套路都有哪些。

回溯算法做剪枝,就是在for循环这里做文章,减小范围

要选k个元素,已经选了path.size(),还需要选取k-path.size个元素

例子:要从5个元素里面找3个元素,右面边界最多到5-3+1=3,  a b c d e,也就是c的位置,因为从这之后,比如从d开始选,就小于3个了。这就是至多到n-(k-path.size())的原因

class Solution {private List<Integer> path = new ArrayList<>();private List<List<Integer>> result = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backingTracking(n,k,1);return result;}void backingTracking(int n,int k,int beginIndex){if(path.size()==k){//收割结果result.add(new ArrayList(path));return;}//单层递归逻辑//不是0开始,而是1for(int i = beginIndex;i<=n-(k-path.size())+1;i++){path.add(i);//递归backingTracking(n,k,i+1);//回溯path.removeLast();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/293362.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<JavaEE> 网络编程 -- 网络编程和 Socket 套接字

目录 一、网络编程的概念 1&#xff09;什么是网络编程&#xff1f; 2&#xff09;网络编程中的基本概念 1> 收发端 2> 请求和响应 3> 客户端和服务端 二、Socket套接字 1&#xff09;什么是“套接字”&#xff1f; 2&#xff09;Socket套接字的概念 3&…

CVE-2023-49898 Apache incubator-streampark 远程命令执行漏洞

项目介绍 Apache Flink 和 Apache Spark 被广泛用作下一代大数据流计算引擎。基于大量优秀经验结合最佳实践&#xff0c;我们将任务部署和运行时参数提取到配置文件中。这样&#xff0c;带有开箱即用连接器的易于使用的 RuntimeContext 将带来更轻松、更高效的任务开发体验。它…

鸿蒙系列--组件介绍之其他基础组件(上)

上回介绍了基础组件中最常用的组件常用的基础组件&#xff0c;接下来还有其他基础组件 一、Blank 描述&#xff1a;空白填充组件 功能&#xff1a;在容器主轴方向上&#xff0c;具有自动填充容器空余部分的能力。只有当父组件为Row/Column时生效 子组件&#xff1a;无 Blan…

无约束优化问题求解(3):共轭梯度法

目录 4. 共轭梯度法4.1 共轭方向4.2 共轭梯度法4.3 共轭梯度法的程序实现4.4 非二次函数的共轭梯度法 Reference 4. 共轭梯度法 4.1 共轭方向 最速下降法的线搜索采取精确线搜索时&#xff0c;由精确线搜索需要满足的条件&#xff1a;迭代点列 x k 1 x k α k d k x_{k1}…

毅速:3D打印随形冷却水路助力模具行业降本、提质、增效

随着模具行业的不断发展&#xff0c;模具制造的精度和效率已经成为企业核心竞争力的重要组成部分。为了满足市场需求&#xff0c;模具行业一直在寻求新的制造技术和方法。3D打印技术的出现&#xff0c;为模具行业带来了革命性的变革。其中&#xff0c;3D打印随形冷却水路的应用…

基于比较的排序算法总结(java实现版)

目录 什么是基于比较的排序算法 什么是排序算法的稳定性 基础排序算法的稳定性 插入排序法 希尔排序法 冒泡排序法 总结 高级算法的稳定性 快速排序法 堆排序法 归并排序法 总结 注意 什么是基于比较的排序算法 基于比较的排序算法定义&#xff1a;之所以能给元素…

C# NPOI导出datatable----Excel模板画图表

1、创建Excel模板 2、安装NPOI管理包 3、创建工作簿 &#xff08;XLSX和XLS步骤一样&#xff0c;以XLS为例&#xff09; IWorkbook workbook null; string time DateTime.Now.ToString("yyyyMMddHHmmss"); string excelTempPath Application.StartupPath "…

论文解读:Informer-AAAI2021年最佳论文

论文背景 应用背景 训练的是历史数据&#xff0c;但预测的是未来的数据&#xff0c;但是历史数据和未来数据的分布不一定是一样的&#xff0c;所以时间序列应用于股票预测往往不太稳定 动作预测&#xff1a; 基于之前的视频中每一帧动作&#xff0c;预测下一帧这个人要做什么…

python之导入.py文件

目录 1、文件结构 2、导入.py文件 2.1同一层内文件夹内的导入 2.2不同层内文件夹内的导入 1、文件结构 Paint_master是一个工程的根目录&#xff0c;忽略一些文件及文件夹后&#xff0c;其文件结构如下&#xff1a; src util ImageUtil.py view BaseAdjustDialog.py MainW…

Sobit:将BRC20资产桥接到Solana ,加速铭文市场的火热

2023 年 1 月份后&#xff0c;比特币 Ordinals 协议出现后为铭文赛道的出现奠定了基础&#xff0c;它以聪为单位将比特币分成份&#xff0c;并在每一聪上攥刻不同的信息以达到非同质化资产的效果&#xff0c;而此后包括 BRC20 在内的诸多采用了 Ordinals 方案的应用不断面向市场…

告别高昂存储,高效灵活管理数据

前言 在当今数字化时代&#xff0c;企业面临着海量数据的挑战&#xff0c;这些数据承载着技术创新和业务发展的重要使命。因此&#xff0c;高效、安全地收集、存储和管理数据成为了企业关注的焦点。对于需要长期储存且低频聚合分析的数据&#xff0c;组织需要更加低成本和便捷…

【EI会议征稿】第三届算法、微芯片与网络应用国际会议(AMNA 2024)

第三届算法、微芯片与网络应用国际会议&#xff08;AMNA 2024&#xff09; 2024 3rd International Conference on Algorithms, Microchips and Network Applications 第三届算法、微芯片与网络应用国际会议(AMNA 2024) 将于2024年3月8-10日在中国西安召开, AMNA 2024将围绕 …