| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 关于“组合”“全排列”等问题的回溯解法 -> 正文阅读 |
|
[数据结构与算法]关于“组合”“全排列”等问题的回溯解法 |
本篇文章是关于leetcode的三道递归/回溯问题的探究,分别是“组合”“全排列”“字母大小写全排列”三个问题。 (1)组合 给定两个整数? ?看到本题,大多数人想到的是先使用暴力for循环来遍历这个数组,但是发现当所给的n和k足够大时,就会嵌套太多的for循环,不利于我们的解题。此时,遇到嵌套层数过多的情况,我们要选择回溯法递归来解决此类问题,我们可以将回溯法解决问题抽象为树类的树形结构来解决,我们将此类为题化成树形结构来解决,如图所示: 可以发现出,1,2,3,4依次取数,当前面取过的数字以后,后面取的数字就不能与之成为组合,每次选的元素都会变化,当我们搜寻到这棵树的叶子结点时,就能找到所有的集合。 下面写出我们的代码:
?通过观察发现,图中? for( int i = start; i <= n ; i++)处存在浪费的情形。举例说明,假如给定的n是4,k给定的值是3时,我们发现当i取值为2时,i满足条件2<=4,但是无论如何取值,则永远无法在2这个位置找到3个数的组合。 我们再次举出例子来找出规律,当n=4,k=3时: temp.size() = 0 时还需要3个数构成组合,最后3个数为{2, 3, 4},故此时至多应遍历到2 我们可以找出规律,最后的要遍历的数字和数组的当前元素个数和n、k的值有关系,即 lastnum=n-(k-temp.size())+1; 所以我们可以对上述代码段进行剪枝优化,来降低代码的复杂度。
? (2)全排列 给定一个不含重复数字的数组? 此题与上题有异曲同工之妙,都是需要将数组中的数字进行组合并且进行返回。但是本题是给定一个数组,让你返回不同的排列顺序。?每一个数组中都存在三个元素,但是每个数组不允许有重复的元素出现,所以我们第一时间就是想到了回溯法。回溯法允许试错,发现下一步得不到答案时,就会返回上一步再次寻找问题的答案,重点是回退这一步骤,和深度优先遍历算法很类似,我们同样也画出树形图来观察。
如果取了1,2,3中的一个数字后,怎么保证下次取值避开这个值呢,我们想到可以使用状态数组bool类型来记录是否取到该值,具体代码如下: ?
(3)字母大小写全排列 给定一个字符串 ?本题同样是要求将给定字符串组合排列得到新的字符串的集合,我们同样可以采用回溯算法,下面给出相应的代码:
以上三题都是回溯的经典题型,其实可以找到规律,我们可以把解题步骤分为四部:找到递归终止条件-->满足递归条件式->开始递归->恢复现场 这四部,还需多多练习,掌握思想才是王道! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:19:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |