递归

一道递归/动规易错题的总结

廉价感情. 提交于 2020-03-04 04:19:39
这两天做leetcode发现自己对一个递归/动规的问题容易想错,特此来总结一下 总共3道题 一个是前几天碰见的面试题,给定一个二叉树还有一个给定的数值,让找到这课二叉树是否有一条路径上的值的和刚好等于给定的值(这里的路径只能从父节点到子节点) Leetcode 1367 这道题是相当于上面的变体,给定一个二叉树还有一个链表,判断二叉树上是否有一条路径刚好等于链表上的那条路径。 第三题也是leetcode上的一题,但是忘了哪道了。记得是一个字符串里,需要计算最长满足另外一个字符串的连续子串的问题。 上面的三个问题容易犯一个共同的错误就是递归去做这道题的时候,递归函数容易写成如下(比如以第二题为例): bool isSubPath ( ListNode * head , TreeNode * root ) { if ( head == NULL ) return true ; if ( root == NULL ) return false ; bool res = false ; if ( head - > val == root - > val ) res = isSubPath ( head - > next , root - > left ) || isSubPath ( head - > next , root - > right ) ; if ( res == true )

python基础之内置函数

ⅰ亾dé卋堺 提交于 2020-03-04 04:06:29
内置函数   内置函数    匿名函数    递归函数   二分查找法 --------------------------------------------------------------------------------- 内置函数 接下来,我们就一起来看看python里的内置函数,到现在,python为我们提供了 68 个函数 让我们来了解了解有哪些内置函数. Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next() slice() any() divmod() id() object() sorted() ascii() enumerate() input() oct() staticmethod() bin() eval() int() open() str() bool() exec() isinstance() ord() sum() bytearray() filter() issubclass() pow() super() bytes() float() iter() print() tuple() callable() format() len() property() type() chr() frozenset() list() range()

省选模拟37 题解

点点圈 提交于 2020-03-04 00:03:21
A. Alchemy 考虑递归挪动这个塔的过程。 然后发现有一些递归是没有必要的。 通过初始状态可以判断递归的前半部分或后半部分是没有必要的。 直接统计不递归的部分的贡献,然后递归另一部分就好了。 这样的复杂度应该可以做到线性。 B. Algebra 要统计这个答案无非两个办法。找到 $n$,判断在两个进制下的和是否相等。 找到两个进制下相等的数,然后取交集找到 $n$。 采用后一种办法。 考虑首先写一个函数 $next(n,k,s)$ 表示 $\geq n$ 的 $k$ 进制下总和为 $s$ 的最小的数字。 这个函数写一个类似数位 dp 的东西就可以 $O(log n)$ 求出来。 然后设 $g_s$ 表示 $s$ 的答案至少为 $g_s$。 那么每次取出最小的 $g_s$,通过 $next(g_s,a,s),next(g_s,b,s)$ 的取值,可以判断是否找到答案。 如果没有找到答案,那么更新 $g_s$ 。 C. Anarchy 暴力的做法是枚举$x,y$,然后计算两点之间的距离。 然而这个算法不是很好优化,考虑现在枚举 $x$ 和 $y-x$。 也就是说枚举爆炸点和爆炸向量,然后可以更新对应的 $y$。 这样的话问题可以写成一个卷积的形式 $ans_y=\sum \limits_{i \oplus j=y}a_i*dis_j$。 $\oplus$

算法图解|选择排序和递归

帅比萌擦擦* 提交于 2020-03-03 22:30:30
一:选择排序,O(n2) 选择排序是一种灵巧的算法,但其速度不是很快 代码示例: # 选择排序:O(nxn) # 找出数组中最小的元素 def findsmallest(arr): # 假设小值为arr[0] smallest = arr[0] # 存储最小元素的索引 smallest_index = 0 # O(n) for i in range(1, len(arr)): if arr[i] < smallest: smallest = arr[i] smallest_index = i return smallest_index # 对数组进行选择排序 def selectionSort(arr): newArr = [] # O(nxn) for i in range(len(arr)): smallest_index = findsmallest(arr) # 将该索引的元素添加到newArr newArr.append(arr.pop(smallest_index)) return newArr print(selectionSort([1, 8, 6, 9, 10])) # [1, 6, 8, 9, 10] 二:递归 问题:有个盒子里有盒子,而盒子里的盒子又有盒子。钥匙就在某个盒子中。怎么能找到钥匙。 代码示例: 第一种方法: 详细检查盒子内的东西

矩阵连乘问题

元气小坏坏 提交于 2020-03-03 22:08:39
由于矩阵的乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这中计算次序 可以用加括号的方式来确定。例如,矩阵连乘积A1A2A3A4可以有5种不同的完全加括号方式: (A1(A2(A3A4))) (A1((A2A3)A4)) ((A1A2)(A3A4)) ((A1(A2A3))A4) (((A1A2)A3)A4) 矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p*q的矩阵, B是一个q*r的 矩阵,其乘机C=AB是一个p*r的矩阵,总共需要pqr次数乘。 为了说明在计算矩阵连乘积 时,加括号方式对整个计算量的影响,我们考察计算3个矩阵A1A2A3的连乘积的例子。 这3个矩阵的尺寸分别为10*100,100*5和5*50。 若以((A1A2)A3)这种方式计算, 3个矩阵的连乘积需要的数乘次数为7500。 若以(A1(A2A3))这种方式计算, 所需的数乘次数为75000。显然,在即算矩阵连乘积时,加括号方式对计算量有很大影响。 1.分析最优解的结构 设计求解具体问题的动态规划算法的第一步是刻画该问题的最优解的结构特征。我们将矩 阵连乘积AiAi+1....Aj简记为A[ i : j ]。考察计算A[ 1: n]的最优计算次序。设这个计算 次序在矩阵Ak和Ak+1之间将矩阵链断开,1<=k<n,则其相应的完全加括号形式为((A1...Ak) (Ak+1..

递归排序数组(图文讲解)

僤鯓⒐⒋嵵緔 提交于 2020-03-03 20:54:21
递归排序数组 本人为一名普通二本学校自动化专业的大二学生,对编程有着少许兴趣。 小郑最近一直都有在看视频学习递归,所以想写一篇博客作为学习笔记。 题目要求 计划输入一组乱序数组给递归函数,然后输出排好序的数组(从小到大)。 题中要求用递归来给数组排序,所以我们可以通过次递归函数排一个的情况,将每个数排到相应位置上。对这个问题,我给出了两个方案。 方案一:前排法 将要排序的元素下标和值都先保存下来,然后再向“前面”和其他元素比较。 首先由于递归函数的调用,k不断“-1”,最后到k==1的时候停止,然后开始回到“上一个”递归函数,开始第二个元素排序。 第二个元素排序 我们可以想象将第一个元素“拿出来”,与第一个元素比较,如果temp比arr[index]大的话则放回原位,否则与第一个元素交换。 第三个元素排序出现了前面比后面大的情况。当第二个元素(6)大于temp(3)时,第二个元素成为第三个元素。 temp要与第一个元素相比较,大于第一个元素则,temp成为了第二个元素,排序成功。 接下来步骤都相似,我就不再这里一一列举了(若想加深理解,可以看看后排法,图文更加详细、清晰)。 //递归排序数组 # include <bits/stdc++.h> using namespace std ; void f ( int * arr , int k ) { if ( k == 1 )

二叉树图解以及二叉树的递归原理

帅比萌擦擦* 提交于 2020-03-03 20:46:18
递归(recursion) 又称递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。 一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 构成递归需具备的条件: 1. 子问题须与原始问题为同样的事,且更为简单; 2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。 代码取自美国课本 "Java How to Program "(Deitel & Detel)的练习: 20.25。 以中序遍历递归方法为例,这里显示的图解,仅诠释开始一小部分递归前进段与递归返回段的交叉过程。通过这一小段的繁琐解释,希望读者可见到二叉树递归遍历的端倪。 private void inorderHelper( TreeNode node ){ if ( node == null ) //若节点为空 return; //无任何操作 inorderHelper( node.leftNode ); //有序遍历下一级左子树 System.out.print( node.data + " " ); //输出节点数据 inorderHelper( node.rightNode );//有序遍历下一级右子树 } 插图说明: 前进段的进程 1 :鉴于以树根 节点 "49" 为参数,调用 inorderHelper(...)

C语言-递归操作

时光毁灭记忆、已成空白 提交于 2020-03-03 20:45:02
使用递归进行循环打印 /* 递归问题 */ #include <stdio.h> void print(void) { printf("1\n"); print(); } int main() { print(); return 0; } 使用递归从0打印到当前这个数字 /* 将数字进行从小到大的打印 */ #include <stdio.h> void print(int max) { if (max == 1){ printf("%d ", 1); return ; } print(max - 1); printf("%d ", max); } int main() { int val = 0; printf("请输入要打印的数字:"); scanf("%d", &val); print(val); printf("\n"); return 0; } 使用递归构建菲伯纳序列 /* 0 1 2 3 4 5 6 7 8 1 1 2 3 5 8 13 21 34 非伯纳系数 */ #include <stdio.h> int feibo(int max) { if (max <= 1) { return 1; } return feibo(max - 1) + feibo(max - 2); } int main() { int result = feibo(8); printf("

复杂计算之多层递归案例

让人想犯罪 __ 提交于 2020-03-03 17:25:21
【摘要】 石油化工行业,经常要构造特殊中间表,以物料、时间、指标名等为参数,查询出对应层级的指标值!由于前端报表模块已经定型,用户不希望再改变,所以只能按照数据库的思路造出这种中间数据集以适用于报表;但事先不能确定维度及其层次的深度,导致 SQL 很难写 (往往用上百行代码才实现一种类型的算法)。总结一下难点:SQL 难以简化、工作量大、维护难、优化难。若能在应用层集成数据计算引擎中间件,使用一致的结构化计算模型,为应用提供统一计算服务;可极大的降低应用与数据库的耦合,后期维护也完全模块化!赶快去乾学院看个究竟吧! 复杂计算之多层递归案例 【下载附件】复杂计算之多层递归案例 来源: oschina 链接: https://my.oschina.net/u/3949403/blog/3186701

动态规划

喜你入骨 提交于 2020-03-03 15:43:07
目录 1. 步骤 2. 要素 3. 装配线调度 4. 矩阵链乘 5. 最长公共子序列(Longest Common Subsequece) 6. 最优二叉查找树(Optimal Binary Search Tree) 1. 步骤 描述问题的最优解(optimal solution)结构特征 递归定义最优解值 自底向上 计算最优解值 从已计算得到的最优解值信息中构造最优解 2. 要素 最优子结构和重叠子问题 最优子结构性质是指一个问题的最优解中所包含的所有子问题的解都是最优的。 动态规划避开了递归时,重复计算相同子问题的过程,对每个子问题只解一次,而后将其保存在一个 表格中,当再次需要的时候,查表获取。 3. 装配线调度 最优子结构性质:如果问题的解是最优的,则所有子问题的解也是最优的。在这里,描述为最优 路径的子路径也是最优的。 最优子结构证明:剪枝法 ∵如果子路径P1从开始到S1,j-1不是最优的,那么一定存在一条从开始到S1,j-1的更优子路径P2, 当用P2去替换原子路径P1后,将得到一条比原路径更优的路线,这与假设从开始到S1,j是一条最 优路线矛盾。 ∴子路径P1一定也是最优的 递归定义最优路线的最快时间 最快时间 f =min(f1[n]+x1,f2[n]+x2) 要得到f 值,需要计算fi[j]的每个值 f1[j]=min{f1[j-1]+a(1,j),f2[j-1]