【20230227】回溯算法小结
创始人
2024-05-28 14:20:49
0

回溯法又叫回溯搜索法,是搜索的一种方式。

回溯法本质是穷举所有可能。如果想让回溯法高效一些,可以加一些剪枝操作。

回溯算法解决的经典问题:

  • 组合问题

  • 切割问题

  • 子集问题

  • 排列问题

  • 棋盘问题

如何去理解回溯法?

回溯法解决的问题都可以抽象为树形结构,回溯法解决的是在集合中递归查找子集,集合的大小构成树的宽度,递归的深度构成树的深度。

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

回溯法模板

回溯三部曲

  • 回溯函数模板返回值以及参数(一般返回值都为void)

  • 回溯函数终止条件

if(终止条件){存放结果;return;
}
  • 回溯搜索的遍历过程

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

组合问题

组合

在for循环中,i的结束条件可以优化,即:

列表剩余元素个数n-i+1>=所需元素个数k-path.size(),i<=n-k+path.size()+1。

组合总和

无重复数

可重复取

组合总和II

有重复数

不可重复取

组合总和III

无重复数

不可重复取

组合总和IV

无重复数

可重复取,且有排列(动规问题)

组合总和III

电话号码的字组合

数字与字母的映射问题可以用map,也可以用一个二维数组;

将char型转为int型,用char-‘0’的方式。

组合总和

可以重复使用元素,所以startIndex直接等于i就行了,不能直接每次都从0开始(这是排列的情况,会有重复出现);

组合总和II

集合中出现了重复元素,如果用之前的常规做法,会出现下面重复的情况,因此需要去重工作。

组合总和IV

用回溯超时了,是动态规划问题。


切割问题

分割回文串

  1. 如何切割的问题--确定分割点,例如abcdef,切割一个a后,在bvdef中再去切割第二段

  1. 如何判断为回文串--写一个bool型函数,专门用来判断

注意:截取子字符串substr(n,m)表示从下标n开始取m个元素。

复原IP地址

  1. 如何切割的问题,确定切割点,插入.号,用已经插入.号的数量来判断是否结束

  1. 如何判断是否为有效IP地址

注意一些细节问题:

string中插入 insert 擦除erase,因为已经插入.号,因此下一层递归开始应该在i+2处

除了只有一个0以外,以0开头的数字不合法;大于255不合法;

    bool isValid(string& s,int left,int right){if(left>right)  return false;if(s[left]=='0'&&left!=right) return false;int x=stoi(s.substr(left,right-left+1));if(x<=255)  return true;else return false;}

子集问题

子集 (不含重复元素)

子集问题是找树的所有节点,而组合和分割问题都是收集树的叶子节点。

每个节点都需要保存,所以先存,再判断终止条件。

子集II (含有重复元素)

在同一层中不可选取相同元素,属于树层去重。

其实树层去重可以不用used数组,直接排序后判断相邻的数是否相同就可以完成树层去重。

注意:去重都需要排序!!!

递增子序列

需要解决的问题:

  1. 去重问题,仍然是树层的去重,但是不能对数组进行排序了,于是用哈希表进行去重;

  1. 选取的是符合条件的每个节点,其实可以与之前的联系起来,相当于可以不用写终止条件;


排列问题

全排列(没有重复元素)

排列问题就不需要startIndex了,需要使用used数组,来确定该数字在path中已经被取过了。

全排列II(有重复元素)

使用used数组+哈希表进行树枝去重和数层去重。


相关内容

热门资讯

安卓9系统怎样应用分身,轻松实... 你有没有发现,手机里的APP越来越多,有时候一个APP里还要处理好多任务,分身功能简直就是救星啊!今...
获取安卓系统的ip地址,轻松获... 你有没有想过,你的安卓手机里隐藏着一个神秘的IP地址?没错,就是那个能让你在网络世界里找到自己的小秘...
LG彩电安卓系统升级,畅享智能... 你家的LG彩电是不是最近有点儿“闹别扭”,屏幕上时不时地跳出个升级提示?别急,今天就来给你详细说说这...
阴阳师安卓苹果系统,安卓与苹果... 亲爱的玩家们,你是否曾在深夜里,手握手机,沉浸在阴阳师的神秘世界?今天,就让我带你一起探索这款风靡全...
华为安卓系统区别在哪,独特创新... 你知道吗?最近手机圈里可是热闹非凡,尤其是华为的新动作,让很多人眼睛都瞪大了。没错,我说的就是华为自...
怎么重新刷安卓手机系统,深度解... 手机用久了,是不是感觉卡顿得厉害?别急,今天就来教你怎么重新刷安卓手机系统,让你的手机焕然一新,速度...
刷正版安卓系统教程,刷正版安卓... 你有没有想过,让你的安卓手机焕然一新,体验一把正版系统的魅力呢?别急,今天就来手把手教你如何刷正版安...
移动支撑系统安卓版,助力移动办... 你有没有发现,现在的生活越来越离不开手机了?无论是工作还是娱乐,手机几乎成了我们生活的必需品。而今天...
安卓怎么进win系统界面,安卓... 亲爱的安卓用户,你是否曾幻想过在安卓设备上直接体验Windows系统的魅力?别再羡慕那些Window...
incall可以升级安卓系统吗... 你有没有想过,你的手机是不是也能像电脑一样,时不时地来个系统升级呢?今天,咱们就来聊聊这个话题——i...
安卓系统带农历软件,尽享传统节... 你知道吗?现在智能手机上有个特别实用的功能,那就是农历显示。对于咱们中国人来说,农历可是有着深厚的历...
安卓系统资源占用高,揭秘原因与... 你有没有发现,你的安卓手机最近变得越来越慢了?是不是觉得打开一个应用都要等半天,甚至有时候还会卡死?...
安卓10的系统有哪些,功能升级... 你有没有发现,你的安卓手机最近是不是变得有点不一样了?没错,就是那个神秘的安卓10系统!它就像一位魔...
固态硬盘系统迁移到安卓,固态硬... 你有没有想过,把你的固态硬盘系统迁移到安卓设备上,是不是能让你在移动办公或者娱乐时更加得心应手呢?想...
平板电脑能玩安卓系统吗,畅享丰... 你有没有想过,平板电脑竟然也能玩安卓系统?这可不是天方夜谭,而是科技发展的新趋势。想象你手中的平板瞬...
安卓刷精简系统下载,轻松打造高... 你有没有想过,你的安卓手机是不是有点儿“臃肿”了呢?运行速度慢,电池续航短,有时候还卡得要命。别急,...
安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...