回溯算法模板(python)

news2024/11/20 9:24:04
#回溯模板,伪代码
def backtracking(参数):
    if (终止条件):
        存放结果
        return   #如果要将数层中间的结果也插入,就不用写return,比如子集问题
    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)):
        处理节点
        backtracking(参数)     // 递归
        回溯,撤销处理结果

在类中实现回溯方法时,可以将回溯方法放在别的方法中,也可以将回溯方法单独写出来,如下


例题1:(出自代码随想录回溯算法中的2(组合问题),力扣上77题)

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。可以按 任何顺序 返回答案。

示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]

#方法一:回溯方法写在其他方法内,回溯中的参数不用加self
class Solution:
    def combine(self, n: int, k: int) :
        result = []
        path = []
        def backtracking(n,k,start):
            if len(path) == k:
                result.append(path[:])
                return
            for i in range(start,n + 1):
                path.append(i)
                backtracking(n,k,i + 1)
                path.pop()
        backtracking(n,k,1)
        return result


#方法二:回溯方法单独写,回溯中的参数需要加self
class Solution:
    def __init__(self):
        self.result = []
        self.path = []
    def backtracking(self,n,k,start):
        if len(self.path) == k:
            self.result.append(self.path[:])
            return
        for i in range(start,n + 1):
            self.path.append(i)
            self.backtracking(n,k,i + 1)
            self.path.pop()
    def combine(self, n: int, k: int):
        self.backtracking(n,k,1)
        return self.result

例题2:回溯法去重,防止结果中出现重复的集合(回溯算法第8题:组合总和ll)

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次 。

  • 示例 1:
  • 输入: candidates = [10,1,2,7,6,1,5], target = 8,
  • 所求解集为:
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]

思路:首先对candidates排序,在回溯时要去重,同一层不能有重复的元素 

class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        result = []
        path = []
        def backtrack(candidates,target,sum_,start):
            if sum_ == target:
                result.append(path[:])
                return
            elif sum_ > target: return
            for i in range(start,len(candidates)):

                if i > start and candidates[i] == candidates[i - 1]:
                     continue
                #此两句为去重核心,尤其是i>start说明这一层已经开始循环了

                if candidates[i] > target - sum_: return
                path.append(candidates[i])
                sum_ += candidates[i]
                backtrack(candidates,target,sum_,i + 1)
                a = path.pop()
                sum_ -= a
        candidates.sort()
        backtrack(candidates,target,0,0)
        return result

另一种同一数层去重:例题:回溯算法14-递增子序列

数层,树枝双去重:例题:回溯算法16-全排列ll

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

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

相关文章

通过Python的PIL库进行图像的过滤

文章目录 前言一、素材准备二、演示1.引入库2.定义图片路径3.打开原图4.过滤方法4.1图像的模糊效果代码效果图 4.2图像的轮廓效果代码效果图 4.3图像的细节效果代码效果图 4.4图像的边界效果代码效果图 4.5图像的边界加强效果代码效果图 4.6图像的阈值边界加强效果代码效果图 4…

自定义bean对象实现hadoop序列化

文章目录 一、源代码1.UserSaleMapper类2. UserSaleReducer类3. UserSaleDriver类4.pom.xml 二、执行结果 指导参考图: 一、源代码 1.UserSaleMapper类 package org.example.writable;import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Tex…

大厂对ChatGPT的开发利用和评估案例收录

ChatGPT已经进入各行各业,但是实际在工作中的有哪些应用呢?这里分享互联网一线大厂分享的一些实际使用案例,所有文章收录到 大厂对ChatGPT的开发利用和评估案例收录http://​www.webhub123.com/#/home/detail?projectHashid67792343&own…

Visual Studio 2019 C# 上位机入门(2):写一个简单的串口助手

前言 本文记录一下用Visual Studio 2019 C# 写一个简单的串口助手的过程,由于没有先从小处学习,而是直接找相关资料就开始做,免不了很多奇怪的问题花了一些时间,基于此情况,我将尽可能整理出更多细节,尤其…

Linux基础内容(20)—— 共享内存

Linux基础内容(19)—— 进程间通信(介绍与管道内容)_哈里沃克的博客-CSDN博客 目录 1.共享内存的原理 2.共享内存的概念和特点 创建共享内存 共享内存的形式 共享内存(ipc资源)的调用和特征 用户接口删除共享内存 共享内存关联 去关联 特点 …

React基础学习(一)

一、虚拟DOM和真实DOM <script type"text/babel"> // 此处一定要写babel!!!!!!!// 1. 创建虚拟DOM// const VDOM <h1 id"title">Hello, React!</h1> // 此处一定不要写引号 因为这不是字符串!!!!!!!const VDOM ( // 如果有多层嵌套&a…

PostgreSQL15.2最新版本安装_远程连接_Navicat操作_pgAdmin操作_Windows10上安装---PostgreSQL工作笔记001

首先去下载postgresql https://www.enterprisedb.com/downloads/postgres-postgresql-downloads 下载地址: 去上面的地址下载,最好下载10版本的,我这里下载的是15版本的,有问题,后面说吧 下载以后 然后双击安装 next 选择目录next next 输入密码next

好程序员:Java线下培训有必要吗?零基础想学Java怎么学?

有粉丝问好程序员&#xff1a;自己只有周末有时间&#xff0c;想报班学习Java编程&#xff0c;是线上学编程好还是线下学编程好&#xff1f;小源从实际客观以及学习效果的角度来讲&#xff0c;毫无疑问是线下学编程的效果会更好。为什么这样说呢&#xff1f; 比如&#xff1a;家…

初探强化学习

1.引言 人生中充满选择&#xff0c;每次选择就是一次决策&#xff0c;我们正是从一次次决策中&#xff0c;把自己带领到人生的下一段旅程中。在回忆往事的时候&#xff0c;我们会对生命中某些时刻的决策印象深刻&#xff1a;“还好当时选择了读研&#xff0c;毕业后找到了一份自…

学习小程序基础内容之逻辑交互

我们先来看一下实现的效果。 然后再来分享结构。 结构分为左右3:7 分配&#xff0c; 左侧是类别&#xff0c;右侧是该类别对应的品牌。 后台会在onload的请求把左侧的类别返回来&#xff0c;然后我们通过循环把数据展示出来。然后通过点击事件&#xff0c;把对应的品牌请求回来…

2023年,初级测试到高级测试开发工程师需要什么技能?卷起来......

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

泵站水闸自动化系统调试方案

1、调试方案概述 调试方案分为自控系统现场调试、视频系统现场调试以及控制中心远程调试&#xff08;包含通讯测试、自控调试和视频调试&#xff09;。 自控系统现场调试分为触摸屏调试和本地上位机调试两部分。触摸屏系统的调试步骤如下&#xff1a; 确认触摸屏和PLC的通讯情…

C++标准库 -- 泛型算法 (Primer C++ 第五版 · 阅读笔记)

C标准库 -- 泛型算法 (Primer C 第五版 阅读笔记&#xff09; 第10章 泛型算法------(持续更新)10.1、概述10.2、初识泛型算法10.2.1、只读算法10.2.2、写容器元素的算法10.2.3、重排容器元素的算法 10.3、定制操作10.4、再探迭代器10.5、泛型算法结构10.6、特定容器算法 第10…

【ubuntu】将硬盘挂载到指定目录并设置开机自动挂载

最近打算将数据盘开机自动挂载&#xff0c;省得每次都要手动挂载&#xff0c;总结步骤如下&#xff1a; 输入以下命令&#xff0c;将系统中所有的分区都列出来&#xff1a; sudo fdisk -l找到你要挂载的分区&#xff0c;可以通过容量大小分辨&#xff0c;当然&#xff0c;有可…

黑马Mysql从入门到高级

文章目录 1. 数据库基础1.1 基础概念1.2 SQL1.2.1 语法1.2.2 数据类型1.2.3 DDL&#xff08;definition&#xff09; 1.3 函数1.3.1 字符串函数1.3.2 日期函数1.3.3 数字函数1.3.4 流程函数 1.4 约束1.5 多表查询1.5.1 连接1.5.2 联合查询 2. 数据库进阶2.1 存储引擎2.1.1 Inno…

中国人民大学与加拿大女王大学金融硕士——学习的阶段让未来的人生更丰盈

初入职场的新人拥有同样的起跑线&#xff0c;经过时间的沉淀&#xff0c;每个人之间就会有差距。差距是怎样被拉开的呢&#xff1f;也可以说是行动导致的。毕竟想是问题&#xff0c;去做才是答案&#xff0c;有行动才会有结果。在职读研与其停留在想的阶段&#xff0c;不如去准…

我发现了PMP通关密码!这14页纸直接背!

一周就能背完的PMP考试技巧只有14页纸 共分成了4大模块 完全不用担心看不懂 01关键词篇 第1章引论 1.看到“驱动变革”--选项中找“将来状态” 2.看到“依赖关系”--选项中找“项目集管理” 3.看到“价值最大化”--选项中找“项目组合管理” 4.看到“可行性研究”--选项中…

「线性DP-步入」最长上升子序列(LIS)

题目描述 给定一个长度为 N 的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数 N。 第二行包含 N 个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 1 ≤ N ≤ 1000 1≤N≤1000 1≤…

【进阶C语言】有关动态内存管理的经典笔试题(详细图文讲解)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于C语言进阶系列&#xff0c;本专栏主要内容为数据的存储、指针的进阶、字符串和内存函数…

.class文件在线转成.java文件方法

使用背景&#xff1a; 工作中碰到老的项目就头疼&#xff0c;有些连源码都没有&#xff0c;解决bug只能从class文件反编译成java后&#xff0c;来读懂业务逻辑。 后来在网上找了一些工具来帮助class文件转码&#xff0c;有些遇到lamda表达式就转换错误&#xff0c;有些使用起…