回溯法总结

news2024/9/27 21:23:49

文章目录

  • 回溯法
    • 如何理解回溯法
  • 回溯算法模板框架如下:
  • 树枝去重树层去重
  • 回溯法去重
    • 什么时候去重?
    • 树层去重
      • 数组used[i-1]:回溯函数的参数
      • startIndex:回溯函数的参数
      • 用Set的对象uset:局部变量
      • 例题
  • 其它细节
      • 对于组合问题,什么时候需要startIndex呢?
      • 什么时候有返回值?
      • 怎么剪枝?
      • 子集问题和组合问题
    • 全排列问题
      • 全排列问题不用startIndex标识开始,每次都从i=0取,只要该元素没取过就行。
      • 全排列去重-用数组used!!!

回溯法

回溯法,一般可以解决如下几种问题:

  • 组合问题:N个数里面按一定规则找出k个数的集合
  • 切割问题:一个字符串按一定规则有几种切割方式
  • 子集问题:一个N个数的集合里有多少符合条件的子集
  • 排列问题:N个数按一定规则全排列,有几种排列方式
  • 棋盘问题:N皇后,解数独等等
    在这里插入图片描述

如何理解回溯法

回溯法解决的问题都可以抽象为树形结构,是的,我指的是所有回溯法的问题都可以抽象为树形结构!

因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度

递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。

回溯算法模板框架如下:

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

树枝去重树层去重

47.全排列II1

回溯法去重

什么时候去重?

集合中含有重复元素

树层去重

数组used[i-1]:回溯函数的参数

  1. 排序集合。

  2. 树层重复:

    i > startIndex && nums[i]==nums[i-1] && used[i-1]==false 
    

startIndex:回溯函数的参数

  1. 排序

  2. 树层重复:

    i > startIndex && nums[i]==nums[i-1] && used[i-1]==false 
    

    用Set的对象uset:局部变量

    1. uset.coantains(nums[i])
      

    例题

    因为含有重复元素需要去重的有:40. 组合II,90. 子集II, 491. 递增子序列,46. 全排列II。

    其中,491. 递增子序列因为集合必须保留原有顺序,无法排序,又要进行树层去重,所以必须用uset去重。

    1. 全排列II见下面的全排列。

    其它细节

    对于组合问题,什么时候需要startIndex呢?

    startIndex来控制for循环的起始位置。

    我举过例子,如果是一个集合来求组合的话,就需要startIndex,例如:回溯算法:求组合问题! (opens new window),回溯算法:求组合总和! (opens new window)。

    如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:回溯算法:电话号码的字母组合

    注意以上我只是说求组合的情况,如果是排列问题,又是另一套分析的套路

    什么时候有返回值?

    函数不遍历整棵树,会提前返回时,需要返回值。

    怎么剪枝?

    1. for循环上,所剩元素不足。

      i<=9-(k-path.size())+1
      
    2. 超出目标和。

    子集问题和组合问题

    了子集问题,在树形结构中子集问题是要收集所有节点的结果,而组合问题是收集叶子节点的结果

    全排列问题

    全排列问题不用startIndex标识开始,每次都从i=0取,只要该元素没取过就行。

    全排列去重-用数组used!!!

    1. 标记元素是否被取过:有重复的全排列必须用used数组。因为当有重复元素时,必须用used[i]标记元素是否被取过。(没有重复元素时,可以判断path.contains(nums[i]),或者用used[i])
    2. 所以used数组既判断是否被取过,也判断树层去重。

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

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

相关文章

测试开发知识图谱

目录 前言&#xff1a; 1 测试方法与理论 2 Shell脚本相关 3 数据库相关 4 git 代码管理 5 Python 编程语言与测试框架 6 Web 自动化测试 7 移动端 app 自动化测试 8 常用开源测试平台 9 客户端专项测试 10 服务端接口测试 11 服务端接口自动化测试 12 服务端性能…

国产CAN收发器XL1050可替代NXP的TJA1050T,性能参数基本一致

CAN收发器是CAN控制器和物理总线之间的接口&#xff0c;在工控等需要CAN通信的应用场合是必要的&#xff0c;工程师通常采用NXP、TI等品牌的&#xff0c;TJA1050T是常见型号之一。XL1050是信路达一款CAN收发器&#xff0c;本文讨论信路达的XL1050 替代NXP的TJA1050T的可行性。 …

前后端分离,前端代理设置

1. 没有vue.config.js的配置方法 1.1 在config目录下的index.js里面加入如下所示代码 proxyTable: {"/api": { // 不能写成^/apitarget: "http://localhost:50000", // 只写域名即可ws: true,changeOrigin: true, // 允许跨域pathRewrite: { // 重写&…

leetcode:除自身以外数组的乘积

除自身以外数组的乘积 medium 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请**不要使用除法&a…

抖音seo矩阵系统源码搭建技术+二开开源代码定制部署

抖音SEO源码是指将抖音平台上的视频资源进行筛选、排序等操作&#xff0c;进而提升其在搜索排名中的权重&#xff0c;从而让更多的用户能够发现并观看到这些视频资源。而抖音SEO矩阵系统源码则是指通过建立一个分析系统&#xff0c;分析抖音中的用户、视频、标签等数据&#xf…

【数据分类】基于蜣螂优化算法优化支持向量机的数据分类方法 DBO-SVM分类算法【Matlab代码#47】

文章目录 【可更换其他群智能算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 蜣螂优化算法&#xff08;DBO&#xff09;2. 支持向量机&#xff08;SVM&#xff09;3. DBO-SVM分类模型4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他群智能算法&#…

Java Leetcode 动态规划 91. 解码方法

未优化版本代码展示&#xff1a; class Solution {public int numDecodings(String s) {char[]charss.toCharArray();int lengths.length();//创建dp数组int[]dpnew int[length];//初始化if(chars[0]!0){dp[0]1;}//特殊情况处理if(length1){return dp[0];}if(chars[1]!0){dp[1…

Postman高级应用——变量、流程控制、调试、公共函数、外部数据文件

目录 流程控制 调试 公共函数 外部数据文件 总结&#xff1a; Postman 提供了四种类型的变量 环境变量&#xff08;Environment Variable&#xff09; 不同的环境&#xff0c;使用不同的环境变量&#xff0c;例如&#xff1a;测试过程中经常会用到 测试环境&#xff0c;外…

PHP5.4以下解决json_encode中文UNICODE转码问题

PHP5.4以下解决json_encode中文UNICODE转码问题 把汉字先urlencode 然后再使用json_encode&#xff0c; json_encode之后 再次使用urldecode来解码&#xff0c; 这样编码出来的json数组中的 汉字就不会出现unicode编码了。 $params[importList][recipientAddress] urlencode(&…

Spring WebFlux使用函数式编程模型构建异步非阻塞服务

1 前言 上文引入了 Spring 框架中专门用于构建响应式 Web 服务的 WebFlux 框架&#xff0c;同时我也给出了两种创建 RESTful 风格 HTTP 端点实现方法中的一种&#xff0c;即注解编程模型。 本文介绍另一种实现方法——如何使用函数式编程模型创建响应式 RESTful 服务&#xf…

解决子元素设置margin-top使父元素也跟着向下移动的问题

先看代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…

rpc、gRPC快速入门,python调用,protobuf协议

什么是rpc?grpc又是什么&#xff1f; 什么是RPC 远程过程调用协议RPC (Remote Procedure Call Protocol) RPC是指远程过程调用&#xff0c;也就是说两台服务器A&#xff0c;B&#xff0c;一个应用部署在A服务器上&#xff0c;想要调用B服务器上应用提供的函数/方法&#xff…

何洁「桔梗」2023巡演广州站7月22日强势回归!

睽违5年&#xff0c;从心出发。7月22日&#xff0c;何洁携新专辑《桔梗》和你相约广州。这次巡回演唱会不仅会带来回忆满满的经典曲目&#xff0c;全新专辑里的作品也会惊喜开唱&#xff0c;期待值拉满。 19岁时年少成名&#xff0c;以不服输的态度诠释音乐至今&#xff0c;应该…

linux中安装nginx

2.安装nginx 2.1 安装nginx前&#xff0c;需要安装的依赖&#xff08;可能是由于nginx版本旧原因&#xff0c;可能最新或较新版本不需安装这些依赖&#xff09; 如下四个依赖需要安装到linux中 2.1.1 安装 pcre 依赖 &#xff08;使用wget命令&#xff09; 步骤一&#xff1…

自动应急灯电路/12V供电的电子节能灯电路设计

自动应急灯电路 本例介绍的自动应急灯&#xff0c;在白天或夜晚有灯光时不工作&#xff0c;当夜晚关灯后或停电时能自动点亮&#xff0c;延时一段时间后能自动熄灭。 一、电路工作原理 电路原理如图 25 所示。 该自动应急灯电路由光控灯电路、电子开关电路和延时照明电路组成…

关于时间序列的平稳性检测

时间序列的平稳性检验 对时间序列的研究和处理&#xff0c;其实也算是有点意思。很多时候就是耍流氓&#xff0c;我们假设它有规律&#xff0c;然后去研究它&#xff0c;等老天开眼的时候&#xff0c;总能找出点东西来自圆其说&#xff0c;嘿嘿。 ARIMA家族的时序模型&#xf…

Java基层云HIS系统源码融合B/S电子病历系统(SaaS模式)

一、云his系统概述 ta是一款满足二甲医院、基层医院机构业务需要的健康卫生云系统。该系统能帮助基层医院机构完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生站和护士站等一系列常规功能&#xff0c;还能与公卫、PAC…

LPDDR4X Ball Description(引脚描述)

SymbolType&#xff08;DDR视角&#xff09;Function中文翻译CK_A CK_An CK_B CK_BnInputClock: CK and CKn are differential clock inputs. All address, command, and control input signals are sampled on the crossing of the positive edge of CK and the negative edge…

Coggle 30 Days of ML(23年7月)任务六:训练FastText、Word2Vec词向量

Coggle 30 Days of ML&#xff08;23年7月&#xff09;任务六&#xff1a;训练FastText、Word2Vec词向量 任务六&#xff1a;学会训练FastText、Word2Vec词向量 说明&#xff1a;在这个任务中&#xff0c;你将学习如何训练FastText和Word2Vec词向量模型&#xff0c;这些词向量…

网络安全(黑客)自学方法

在各大平台搜的网安学习路线都太粗略了。。。。看不下去了&#xff01; 我把自己整理的系统学习路线&#xff0c;拿出来跟大家分享了&#xff01;点击查看详细路线图 建议的学习顺序&#xff1a; 一、网络安全学习普法&#xff08;心里有个数&#xff0c;要进去坐几年&#xf…