代码随想录算法训练营 DAY 24 | 回溯理论基础 77.组合 + 剪枝优化

回溯理论

  • 回溯法就是递归函数,纯暴力搜索

解决的问题

  1. 组合(无顺序) 1 2 3 4 给出大小为2的所有组合

  2. 切割字符串

  3. 子集问题 1 2 3 4,子集有1 2 3 4,12,13,14,…123 124…

  4. 排列(有顺序)

  5. 棋盘问题 N皇后

理解回溯

  • 抽象成一个n叉树,树的宽度就是集合的大小

  • 关键:恢复现场

  • 回溯法模板:

void backtracking(参数) {if(终止条件) {收集结果;return;}for(遍历集合里的每个元素) {处理节点;递归函数;恢复现场;}return;
}

77.组合

  • 本题如果纯for循环暴力的话,k个元素就要嵌套k个for循环。

回溯法的话,就是递归k层。

树形结构

怎么控制每次从哪里开始取?通过每次递归传入一个startIndex控制开始取的下标

在这里插入图片描述

回溯三部曲

  1. 回溯函数的参数

用一个List path存储所有的可能,收集满后放到二维list里。这俩定义成全局变量。

  • 需要哪些参数?范围n,个数k,以及开始的范围startIndex=1
void backtracking(int n, int k,int startIndex)
  • 终止条件 到叶子节点了,path大小=k,收获结果
if(path.size() == k) {result.add(path);  //收集结果return;
}
  • 单层递归逻辑

    for循环,用path收集路径上的元素,然后递归下一层(起始位置i+1)+恢复现场

for(i = startIndex, i <= n; i++) {path.add(i);backtracking(n,k,i+1);path.removeLast();   //恢复现场
}

剪枝

剪枝剪的是孩子,在for循环里完成的,修改i开始遍历的位置,如果元素个数不够了就提前剪掉。

什么时候停止搜索呢?

  • path.size()是已经选取的元素的大小
  • 还剩k-path.size()个元素要选
  • 至多从n-(k-path.size()) + 1的位置开始搜索!再往后一个就满足不了要求了

n-i>=k-path.size(列表剩余元素数目>=所需元素数目),加不加1依照实际情况决定。

举个例子:假设n=4,k=3,path里0个元素。至多从4-(3-0)+1=2,至多从2开始

for(int i = startIndex; i <= n-(k-path.size())+1; i++)
  • 完整java代码
class Solution {List<List<Integer>> result = new ArrayList<>();List<Integer> path = new LinkedList<>();public void backtracking(int n, int k, int startIndex) {if(path.size() == k) {result.add(new ArrayList<>(path));return;}for(int i = startIndex; i <= n - (k-path.size())+1; i++) {path.add(i);backtracking(n,k,i+1);path.removeLast();}}public List<List<Integer>> combine(int n, int k) {backtracking(n,k,1);return result;}
}

注意:result用ArrayList,path用List接口的LinkedList,恢复现场用removeLast。收集结果时要new ArrayList<>(path)

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

平台产品线 | 高频问题更新(2024.3.25)

平台产品线 | 高频问题更新(2024.3.25) 一、SuperMap iServer 问题1&#xff1a;请教一个问题&#xff0c;我们项目上iServer启动不了&#xff0c;日志报错是许可问题吗&#xff1f;我们刚刚更新的许可&#xff1f; 11.1.1 【问题原因】SQLITE BUSY The database file is l…

consul集群部署三server一client

环境&#xff1a; consul&#xff1a;consul_1.16.2_linux_amd64.zip centos7.9 server:192.168.50.154 192.168.50.155 192.168.50.156 client:192.168.70.64 安装目录&#xff1a; [rootrabbit4-64 consul]# pwd /app/consul [rootrabbit4-64 consul]# ls consul consul_1…

兆欧表揭秘:到底是摇表还是电器?

兆欧表&#xff0c;又称摇表&#xff0c;是一种用于测量电气设备、电缆、电机绕组等绝缘电阻的测试工具。虽然现代兆欧表采用电动型和电池供电等多种形式&#xff0c;但其基本功能和用途保持一致。早期的兆欧表多采用手动机械式设计&#xff0c;通过手柄摇动发电来提供所需的高…

YOLOv9改进策略 :block优化 | MobileViTAttention自注意力,更小、更轻、精度更高 ,性能优于MobileNetV3等

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;现有博客都是将MobileViT作为backbone引入YOLO&#xff0c;因此存在的问题点是训练显存要求巨大&#xff0c;因此本文引入自注意力(ViTs)&#xff1a;MobileViTAttention&#xff0c;从而实现高效涨点 &#…

岭师大数据技术原理与应用-序章-软工版

HeZaoCha-CSDN博客 序章—软工版 一、环境介绍1. VMware Workstation Pro2. CentOS3. Java4. Hadoop5. HBase6. MySQL7. Hive 二、系统安装1. 虚拟网络编辑器2. 操作系统安装 三、结尾 先说说哥们写这系列博客的原因&#xff0c;本来学完咱也没想着再管部署这部分问题的说&…

HarmonyOS实战开发-实现自定义弹窗

介绍 本篇Codelab基于ArkTS的声明式开发范式实现了三种不同的弹窗&#xff0c;第一种直接使用公共组件&#xff0c;后两种使用CustomDialogController实现自定义弹窗&#xff0c;效果如图所示 相关概念 AlertDialog&#xff1a;警告弹窗&#xff0c;可设置文本内容和响应回调…

C语言查找-----------BF算法KMP算法

1.问题引入 有一个主字符串&#xff0c;有一个子字符串&#xff0c;要求我们寻找子字符串在主字符串里面开始出现的位置&#xff1b; 2.BF算法 BF算法就是暴力算法&#xff0c;这个做法虽然效率不高&#xff0c;但是按照我们传统的思路依然能够得到结果&#xff0c;接下来我们…

C++项目——集群聊天服务器项目(七)Model层设计、注册业务实现

在前几节的研究中&#xff0c;我们已经实现网络层与业务层分离&#xff0c;本节实现数据层与业务层分离&#xff0c;降低各层之间的耦合性&#xff0c;同时实现用户注册业务。 网络层专注于处理网络通信与读写事件 业务层专注于处理读写事件到来时所需求的各项业务 数据层专…

【HCIP学习】网络类型级数据链路层协议

思维导图在上面哦~ 一、网络类型的分类&#xff08;4种&#xff09; 出现原因&#xff1a;数据链路层使用的协议及规则不同&#xff0c;造成了不同的网络类型 1、多点接入网络&#xff08;MA&#xff09;------一条网段内上出现多个设备 BMA&#xff1a;广播型多点接入&…

工厂能耗管控物联网解决方案

工厂能耗管控物联网解决方案 工厂能耗管控物联网解决方案是一种创新的、基于先进技术手段的能源管理系统&#xff0c;它深度融合了物联网&#xff08;IoT&#xff09;、云计算、大数据分析以及人工智能等前沿科技&#xff0c;以实现对工业生产过程中能源消耗的实时监测、精确计…

软考102-上午题-【信息安全】-杂题+小结

一、杂题 真题1&#xff1a; 真题2&#xff1a; 真题3&#xff1a; 真题4&#xff1a; 真题5&#xff1a; 真题6&#xff1a;

翔云身份证实名认证接口-PHP调用方法

网络平台集成实名认证接口&#xff0c;是顺应当下网络实名制规定&#xff0c;有效规避法律风险。互联网平台若没有实名认证功能&#xff0c;那么便无法保证网民用户身份的真实性&#xff0c;很有可能被虚假用户攻击&#xff0c;特别是在当网络平台产生垃圾信息乃至是违法信息时…

了解一下npm i的流程与原理

流程 执行npm install&#xff0c;先判断有无lock文件。 1、没有lock文件。会先根据依赖构建出扁平的依赖关系决定下哪些包。新版本的依赖关系是扁平化的&#xff0c;老版本是树结构&#xff0c;可能会出现依赖重复安装的问题&#xff0c;老版本示意图如下&#xff1a; 作为前…

基于单片机智能家居控制系统设计

**单片机设计介绍&#xff0c;基于单片机智能家居控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能家居控制系统设计旨在实现家居设备的自动化控制和智能化管理&#xff0c;提高家庭生活的便利性和舒…

Arduino IDE导出esp8266工程编译后的bin文件

一、导出bin文件的方法一 1.通过IDE直接导出&#xff0c;选择 项目 --> 导出已编译的二进制文件&#xff0c;会在工程下生成 build 文件夹&#xff0c;里面有导出的bin文件。 一、导出bin文件的方法二 通过临时文件&#xff0c;找到生成的bin文件。 临时文件的位置&#…

【前端面试3+1】05v-if和v-show的区别、v-if和v-for能同时使用吗、Vuex是什么?【合并两个有序链表】

一、v-if和v-show的区别 v-if 和 v-show 是 Vue.js 中用来控制元素显示与隐藏的指令。 1.v-if&#xff1a; v-if 是根据表达式的真假值来决定是否渲染元素。当表达式为真时&#xff0c;元素会被渲染到 DOM 中&#xff1b;当表达式为假时&#xff0c;元素不会被渲染到 DOM 中。每…

一、图片隐写[Stegsolve、binwalk、010editor、WaterMark、BlindWaterMark、文件头尾]

工具配置 1.Stegsolve 工具地址&#xff1a;http://www.caesum.com/handbook/Stegsolve.jar 解释&#xff1a;该工具需要安装jar包后才能配合使用&#xff0c;下面同时会给出快速打开工具的代码&#xff0c;需要两个文件&#xff0c;启动的时候启动vbs文件 start.bat java …

【力扣hot100】两数之和、字母异位词分组

【1】两数之和 public class TwoNumAddiction {public static void main(String[] args) {int[] nums {3,3};int target 6;int[] indexArr new SolutionNumAddiction().twoSum(nums, target);for (int index : indexArr) {System.out.println(index);}} }class SolutionNumA…

数据分析之Power BI

POWER QUERY 获取清洗 POWER PIVOT建模分析 如何加载power pivot 文件-选项-加载项-com加载项-转到 POWER VIEW 可视呈现 如何加载power view 文件-选项-自定义功能区-不在功能区中的命令-新建组-power view-添加-确定 POWER MAP可视地图

AIGC-Stable Diffusion发展及原理总结

目录 一. AIGC介绍 1. 介绍 2. AIGC商业化方向 3. AIGC是技术集合 4. AIGC发展三要素 4.1 数据 4.2 算力 4.3 算法 4.3.1 多模态模型CLIP 4.3.2 图像生成模型 二. Stable Diffusion 稳定扩散模型 1. 介绍 1.1 文生图功能&#xff08;Txt2Img) 1.2 图生图功能&…