
经典算法
文章平均质量分 68
昨夜的秋天
这个作者很懒,什么都没留下…
展开
-
递归算法要素
递归算法的三个要素。每次写递归,都按照这三要素来写,可以保证写出正确的递归算法!1. 确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。2. 确定终止条件:写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。3. 确定单层递归的逻辑:确定每一层原创 2020-10-14 16:17:26 · 2928 阅读 · 0 评论 -
动态规划
动态规划动态规划就是消除冗余,直接使用之前算过的值,而不需要再次重新计算的方式。记忆搜索1.记忆搜索是某种形态的动态规划。2.记忆化搜索方法不关心达到目的的路径。3.动态规划是规定好每一个递归过程的计算顺序,以此计算,后面的计算依赖前面的计算4.两者都是空间换时间,也都有枚举过程,区别在于动态规划有计算顺序(可以进一步优化),而记忆搜索不用规定。例子:给定数组arr,arr中所有的值都为正数且不重...原创 2018-03-09 21:39:23 · 194 阅读 · 0 评论 -
变位词问题求解
变位词问题,假设有a和b两个字符串,判断b是否为a子串的变位词。例如a = "hello" 时b="ell"、"lel" 、"le" 返回true,b="elo"返回false假设全是a~b的字母组成解:利用滑动窗口思想。代码如下bool IsChangedWord(char *a,int la,char *b,int lb){ if (a == NULL || b==NULL || la&l..原创 2018-03-27 14:31:40 · 251 阅读 · 0 评论 -
对于二叉树的非递归遍历(非常好记的三种方式)
显然,我们需要用一个stack来模拟递归时的函数调用。对于三种遍历,我们都使用push当前节点->push左子树->pop左子树->push右子树->pop右子树的方式。但是cout时机会有所不同。对于前序遍历来说,每次访问到一个节点就cout;对于中序遍历来说,每次将右子节点进栈时,把当前节点cout;对于后序遍历来说,每次pop的时候cout。另外我们还需要一个last...原创 2018-03-27 15:58:17 · 8400 阅读 · 4 评论 -
快排的三种优化方式。
对于快排而言,其核心在partition中,主要是对于pivot的选取上,所以我们可以按以下三种方案进行优化:1.在数组长度大于某一个阈值范围时,我们进行递归快排,当数据长度小于阈值时,我们进行插入排序。2.在partition中选取pivot时,选取首尾中的进行比较,选取中位数为pivot,以保证pivot能够尽可能的固定在中间,而让两端递归的子数组更加均衡。3.进行三路partit...原创 2018-08-09 21:16:20 · 2600 阅读 · 0 评论