代码随想录算法训练营 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;而我们现在要编…

按要求输出序列

问题描述 : 明明的爸爸是一位著名的数学家。他在明明很小的时候就发现明明有过人的数学天赋&#xff0c;因此有意培养他对数学的兴趣。一次&#xff0c;明明的爸爸为了培养明明对数字的敏感&#xff0c;和明明玩起了一个数字游戏&#xff0c;这个游戏的名称叫“按要求输出序列…

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

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

Facebook多个广告账户被封禁的原因及解决方法

在昨天的文章中&#xff0c;我们为大家介绍了Facebook是什么&#xff0c;今天我们接着聊一聊如何解决在Facebook投放多个广告时&#xff0c;广告账户被封禁的问题。想必这个问题困扰着包括社交媒体营销人员、内容创作者、跨境电商从业者在内的许多人。不过别担心&#xff0c;有…

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

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

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

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

CentOS8 安装nvidia-container gpu

Cent OS Docker运行的时候could not select device driver ““ with capabilities: [[gpu]] 原创 解决方法 &#xff1a;nvidia-container-runtime 安装失败 解决方法 &#xff1a; systemctl restart docker yum install nvidia-container-runtime docker start your_contai…

利用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这…

Java基础知识总结(28)

末端方法 末端方法是对流的最终操作。当对某个 Stream 执行末端方法后&#xff0c;该流将会被"消耗"
且不再可用。换句话说就是末端方法一旦调用后就会关闭流&#xff0c;再不能对流进行操作&#xff0c;否则会抛出异常。 方法功能forEach(Consumer action)遍历流…

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…

QT TCP和UDP网络编程

代表网络概念的QTcpSocket,QTcpServer和QUdpSocket&#xff0c;以及QNetworkRequest,QNetworkReply和QNetworkAccessManager之类的高级类来执行使用通用协议的网络操作。 它还提供了QNetworkConfiguration,QNetworkConfigurationManager和QNetworkSession等&#xff0c;实现承载…

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

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