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

news2024/11/30 10:55:50

回溯理论

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

解决的问题

  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.coloradmin.cn/o/1555833.html

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

相关文章

谷歌seo怎么找到优化关键词?

要在谷歌SEO中找到那些能让你的网站排名飙升的优化关键词&#xff0c;关键在于深入研究和了解用户&#xff0c;要明确你的受众群体&#xff0c;想想他们可能会搜索什么内容&#xff0c;这能帮你大致确定方向&#xff0c;然后这时候就需要关键词工具帮助你找到真正需要优化的&am…

Pandas操作MultiIndex合并行列的Excel,写入读取以及写入多余行及Index列处理,插入行,修改某个单元格的值,多字段排序

Pandas操作MultiIndex合并行列的excel&#xff0c;写入读取以及写入多余行及Index列处理&#xff0c;多字段排序尽量保持原来的顺序 1. 效果图及问题2. 源码参考 今天是谁写Pandas的 复合索引MultiIndex&#xff0c;写的糊糊涂涂&#xff0c;晕晕乎乎。 是我呀… 记录下&#…

24.WEB渗透测试-BurpSuite关于app抓包

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;23.WEB渗透测试-BurpSuite&#xff08;二&#xff09; 方法一&#xff1a;使用模拟器&am…

kubernetes-networkpolicies网络策略问题

kubernetes-networkpolicies网络策略问题 问题描述 重点重点重点&#xff0c;查看我的博客CKA考题&#xff0c;里面能找到解决方法 1.部署prometheus监控的时候&#xff0c;都部署成功&#xff0c;但是web访问503-504超时 2.添加ingress的时候也是访问不到&#xff0c;其他命…

【大数据】Flink学习笔记

文章目录 认识FlinkDocker安装Flink基本概念Flink的特点Flink 和 Spark Streaming 对比 基本使用WordCount实现依赖 批模式代码流模式代码网络流模式代码在web UI上提交代码创建项目[^1]编写代码配置打包在Web UI上提交 Flink 架构系统架构核心概念并行度算子链(Opeartor Chain…

第一次运行 Python 项目,使用 python-pptx 提取 ppt 中的文字和图片

人工智能时代&#xff0c;最需要学习的编程语言是&#xff1a;python 。笔者是个 python 小白&#xff0c;昨天花了两个小时&#xff0c;第一次成功运行起来 python 项目 。 项目是 powerpoint-extractor &#xff0c;可以将 ppt 文件中的图片提取出来&#xff0c;并输出到固定…

uniapp开发微信小程序设置分包,简单易学

文章目录 前言一、在 manifest.json文件中的源码试图中配置二、配置pages.json 前言 我们使用uniapp开发微信小程序的时候&#xff0c;当我们的包体积过大的时候&#xff0c;无法真机模拟。 因为小程序单个包只支持2MB&#xff08;现已支持预览4MB&#xff09;&#xff0c;所以…

内网靶机~~dc-2

一、信息收集 1.端口扫描&#xff1a; nmap -sV -p 1-10000 10.1.1.4 2.CMS识别 3.目录扫描&#xff1a; dirsearch http://10.1.1.4/ 4.FLAG1 似乎让我们用cewl生成密码字典&#xff0c;并爆破登录。 cewl -w rewl_passwd.txt http://dc-2/index.php/flag/ 总结&#xff…

Tomcat启动闪退问题解决方法

在使用Tomcat作为Java Web应用服务器的过程中&#xff0c;有时候会遇到Tomcat启动后闪退的问题&#xff0c;给开发和运维工作带来了困扰。本文将针对Tomcat启动闪退问题&#xff0c;列出可能的原因和解决方法&#xff0c;帮助大家快速解决这一常见的技术难题。 可能的原因及解…

【unity】解决unity编译器安装中文汉化包失败

如果有的同学中文包安装失败&#xff0c;我们找到相应的编译器版本&#xff0c;点击在资源管理器中显示按钮&#xff0c; 我们点击当前目录的上一级&#xff0c;进入编译器目录。 找到modules.json文件双击打开 我们找到简体中文&#xff0c;复制downloadUrl后面的值到浏览…

[C++初阶] 爱上C++ : 与C++的第一次约会

&#x1f525;个人主页&#xff1a;guoguoqiang &#x1f525;专栏&#xff1a;我与C的爱恋 本篇内容带大家浅浅的了解一下C中的命名空间。 在c中&#xff0c;名称&#xff08;name&#xff09;可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大&#xff0c;名称…

VBA_MF系列技术资料1-415

MF系列VBA技术资料1-415 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-0…

一次性了解C语言中文件和文件操作

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 文件及文件操作 前言1. 文件分类1.1 文本文件1.2 二进制文件1.3 文本文件和二进制文件的区别 2…

Docker镜像逆向生成Dockerfile

你是否曾经遇到过一个想要使用的 Docker 镜像&#xff0c;但却无法修改以适应你的特定需求&#xff1f;或者你可能发现了一个喜欢的 Docker 镜像&#xff0c;但想要了解它是如何构建的&#xff1f;在这两种情况下&#xff0c;将 Docker 镜像逆向生成一个 Dockerfile 可以使用一…

基于jsp+mysql+Spring的SpringBoot招聘网站项目

基于jspmysqlSpring的SpringBoot招聘网站项目&#xff08;完整源码sql&#xff09;主要实现了管理员登录,简历管理,问答管理,职位管理,用户管理,职位申请进度更新,查看简历 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀…

Science Robotics 逼真面部表情的机器人

人类可以产生数千种不同的面部表情来传达无数微妙的情绪状态&#xff0c;这种能力是人类社会互动中最有效和最有效的界面之一。在 2019 年冠状病毒病流行期间&#xff0c;口罩使社交互动变得尴尬&#xff0c;因为它们掩盖了面部表情。同时&#xff0c;当摄像机打开时&#xff0…

蓝桥杯单片机---第十届省赛题目解析

文章目录 比赛题目一、代码相关定义、声明1.头文件声明2.变量声明 二、主要函数1.main函数2.按键扫描3.数码管显示4.LED显示5.定时器中断 三、次要函数1.初始化函数Init2.按键函数Key3.LED函数Led4.数码管函数Seg5.iic函数中6.onewire函数中 总结 比赛题目 这里因为我没有这个题…

TouchGFX之图像

touchgfx提供的几种图像控件 1.Image&#xff08;图像&#xff09; TouchGFX中的图像会绘制关联图像文件中的像素数据。 使用图像文件前&#xff0c;必须将其导入到项目中。 图像大小是由关联的图像文件定义的&#xff0c;不能在运行时改动。 如果需要将图像显示为不同大小&…

C++链表(上)

【1】概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 (图片为转载&#xff09; 优点&#xff1a;链表的插入操作更快&#xff08; O(1) &#xff09;&#xff0c;无需预先分配内存空间 …

基于JSPM的美食推荐管理系统

背景 互联网的迅猛扩张彻底转变了全球各类组织的运营模式。自20世纪90年代起&#xff0c;中国各级政府和企事业单位便开始探索运用网络系统来处理管理事务。然而&#xff0c;早期的网络覆盖不广、用户接受度不高、相关网络法规不健全以及技术发展不成熟等因素&#xff0c;都曾…