代码随想录算法训练营 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://www.mzph.cn/news/779605.shtml

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

相关文章

wpf 自定义命令

自定义命令 MyCommand.cs public class MyCommand : ICommand {private readonly Action<Object> execAction;private readonly Func<Object,bool> changedFunc;public event EventHandler? CanExecuteChanged;public MyCommand(Action<object> execAction…

尾盘拉升超8个点,速腾聚创交出来一份怎样的超预期答卷?

“如果说2024年是智驾加速渗透&#xff0c;L3级智能驾驶陆续落地的一年&#xff0c;那么激光雷达将是这股潮流中不可缺失的那一份。” 2024年开年&#xff0c;速腾聚创以相当“闪亮的姿态”成为“港股2024年首只IPO上市成功”的企业。 然而&#xff0c;其上市之后的市场表现却…

【MySQL】DQL-基础查询-语句&演示(查询多个字段 / 所有字段/并设置别名/去重)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

天梯练习题集

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 目录 &#x1f449;&#x1f3fb;L1-002 打印沙漏&#x1f449;&#x1f3fb;L1-011 A-B &#x1f449;&#x1f3fb;L1-002 打印沙漏 mycode: #…

嵌入式linux学习之交叉编译器安装

交叉编译器介绍 ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译&#xff0c;编译就需要编译器&#xff0c;在 Liux 进行 C 语言开发里面使用 GCC 编译器进行代码编译&#xff0c;但是 Ubuntu 自带的 gcc 编译器是针对 X86 架构的&#xff01;而我们现在要编…

通过keil MDK生成静态库以减少编译时间

当我们的程序复杂度提高,代码量增大,每次编译都会花费更多的时间,虽然相比较Linux动则好几个小时的编译时间,单片机编译的时间已经算很短了,但是一个200多KB的程序编译也得需要好几分钟。如果将一些成熟固定,几乎不会再去修改的程序编译成静态库,那么可以减少一部分编译…

【一竞技CS2】Falcons战队官宣签下传奇老将dupreeh

1、最近Falcons战队正式官宣签下传奇老将dupreeh&#xff0c;这位31岁的选手将填补BOROS被下放后留下的空缺。加入Falcons后&#xff0c;dupreeh将与老队友Magisk、zonic重聚。dupreeh和他们在Astralis曾一起取得过显赫的成绩&#xff1b;在Vitality时期&#xff0c;dupreeh和老…

智慧公厕,为智慧城市建设注入了新的活力

随着智慧城市的快速发展&#xff0c;公共厕所不再是简单的功能设施&#xff0c;而是成为了提升城市形象、改善民生服务的重要一环。智慧公厕作为新形态的公共厕所&#xff0c;通过精准监测公厕内部的人体活动状态、人体存在状态、空气质量情况、环境变化情况、设施设备运行状态…

利用lidar生成深度图

前言 目前&#xff0c;深度图像的获取方法有&#xff1a;激光雷达深度成像法、计算机立体视觉成像、坐标测量机法、莫尔条纹法、结构光法等。针对深度图像的研究重点主要集中在以下几个方面&#xff1a;深度图像的分割技术&#xff0c;深度图像的边缘检测技术&#xff0c;基于…

真心建议今年拿下软考证书,再不冲就晚了!

随着国家计算机与软件技术的发展&#xff0c;每年报名参加计算机软件资格考试&#xff08;简称&#xff1a;软考&#xff09;的人越来越多。 据工信部新闻发布会消息&#xff1a;2023年有超500万人都在考软考&#xff0c;报名人数较2020年直翻10倍。 据悉&#xff0c;国内持软…

HTTP(1)

目录 一、认识HTTP协议 理解 应用层协议 二、fiddler的安装以及介绍 1、fiddler的安装 2、fiddler的介绍 三、HTTP 报文格式 1、http的请求 2、http的响应 五、认识URL 六、关于URL encode 一、认识HTTP协议 HTTP 全称为&#xff1a;“超文本传输协议”&#xff0c;是…

代码随想录算法训练营第35天| 435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间 题目链接&#xff1a;无重叠区间 题目描述&#xff1a;给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 解题思想&#xff1a; 这道题目和射气球很像。 *“需…

源支付V7免授权版2.99,精心修复各种打不开错误问题

源支付V7免授权版2.99&#xff0c;精心修复各种打不开错误问题 前几次花钱购买都有点问题&#xff0c;这次购买这个版全部测试功能正常 本站一次性修复各种打不开提示提示&#xff0c;祝你使用愉快&#xff0c; 其他说明&#xff1a;其他文件全部没加密&#xff0c;只有8.1这…

Linux(4)常见操作整理-静态路由-双网卡-文件上传下载-运维思路-性能监测方法-jar包查找

五、常见操作 1、静态路由配置 【描述】&#xff1a;当前ifconfig eno16777728 对应ip&#xff1a;172.41.0.120 【解决】&#xff1a; &#xff08;1&#xff09; [rootlocalhost ~]# cd /etc/sysconfig/network-scripts/ &#xff08;2&#xff09; 添加文件&#xff1a…

【CTFshow 电子取证】套的签到题

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

Vue生命周期,从听说到深入理解(全面分析)

每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xff0c;挂载实例到 DOM&#xff0c;以及在数据改变时更新 DOM。在此过程中&#xff0c;它也会运行被称为生命周期钩子的函数&#xff0c;让开发者有机会在特定阶…

HCIP的学习(6)

OSPF—开放式最短路径优先协议 动态路由的评判标准 1、占用资源 2、收敛速度 3、选路动态路由分类&#xff1a; IGP---内部网关协议DV型---距离矢量型---RIPLS型---链路状态型---OSPFEGP---外部网关协议OSPF---无类别的路由协议&#xff08;携带真实掩码&#xff09;组播224.0…

你管这破玩意叫网络

你是一台电脑&#xff0c;你的名字叫 A 很久很久之前&#xff0c;你不与任何其他电脑相连接&#xff0c;孤苦伶仃。 直到有一天&#xff0c;你希望与另一台电脑 B 建立通信&#xff0c;于是你们各开了一个网口&#xff0c;用一根网线连接了起来。 用一根网线连接起来怎么就能…

【JavaEE】Thread类中run和start的区别

文章目录 先说结论Run方法Start方法 先说结论 当你想要创建一个新的线程并执行某些任务时&#xff0c;你应该重写run方法以提供任务的具体实现&#xff0c;并通过调用start方法来启动新线程 run方法包含了线程应该执行的代码&#xff0c;但直接调用它并不会启动新的线程。 s…

斜率优化dp 笔记

任务安排1 有 N 个任务排成一个序列在一台机器上等待执行&#xff0c;它们的顺序不得改变。 机器会把这 N 个任务分成若干批&#xff0c;每一批包含连续的若干个任务。 从时刻 00 开始&#xff0c;任务被分批加工&#xff0c;执行第 i 个任务所需的时间是 Ti。 另外&#x…