递归

树的深度

拈花ヽ惹草 提交于 2020-02-07 22:00:38
有关深度的题: 104. 二叉树的最大深度 DFS递归: 时间复杂度:O(N) 空间复杂度:最坏O(N)(斜二叉树),最好O(logN)(完全二叉树) class Solution { public int maxDepth ( TreeNode root ) { return root == null ? 0 : Math . max ( maxDepth ( root . left ) , maxDepth ( root . right ) ) + 1 ; } } 111. 二叉树的最小深度 DFS递归 class Solution { public int minDepth ( TreeNode root ) { if ( root == null ) return 0 ; if ( ( root . left == null ) && ( root . right == null ) ) return 1 ; int min_depth = Integer . MAX_VALUE ; if ( root . left != null ) min_depth = Math . min ( minDepth ( root . left ) , min_depth ) ; if ( root . right != null ) min_depth = Math . min (

算法复习:递归

爷,独闯天下 提交于 2020-02-07 21:51:10
leedcode 10. 正则表达式匹配 递归解法,时间复杂度比较高,后面要尝试改成动规 bool end_or_not(string p) { for(int i=0;i<p.size();i+=2) { if(((p[i]>='a'&&p[i]<='z')||p[i]=='.')&&p[i+1]=='*') continue; return false; } return true; } bool check(string s, string p) { int donser[27]; memset(donser,0,sizeof(donser)); for(int i=0;i<p.size();i++) { if(p[i]=='.'||p[i]=='*') continue; if(donser[p[i]-'a']==0) { donser[p[i]-'a']=1; int lable=0; if(p[i+1]=='*') continue; for(int j=0;j<s.size();j++) { if(s[j]==p[i]) { lable=1; break; } } if(lable==0) return false; } } return true; } class Solution { public: bool isMatch(string s, string p)

Continuation Passing Style

孤者浪人 提交于 2020-02-07 12:08:24
CPS(Continuation Passing Style, 后续传递风格), 是指将程序的控制流显示地用 Continuation 来传递,而不是像 direct style 那样明确指出下一条语句的编码风格。符合 CPS 的函数需要一个额外的参数:一个显式的Continuation (通常为一个只有一个参数的函数)。一个CPS函数通过以返回值为参数,调用Continuation的方式来返回函数值。当我们调 用一个CPS函数式,被调用的函数需要一个额外的 return procedure 来供被调用的函数使用。用CPS的方式来表达代码可 以使普通程序中很多不明确的内容变得明确。例如,函数的返回值看起来就像是对Continuation的调用,参数的求值顺序也 变得明确,同时,尾调用(tail call)也被直接传递给调用者(caller)。 一个函数可以被自动地从 direct style 转换成 continuation passing style。当在命令式或者过程式语言的编译器中 需要表达SSA(事实上,SSA可以被视作CPS的一个子集)时,编译器可以使用CPS来表达中间代码。 正常函数的返回都隐含一个continuation,就是利用这个函数的返回值来 做的后续事情,而cps的本质就是将这个隐式的 continuation显式的当做参数传递进去

【Python数据结构与算法笔记day36】7.2. 二叉树的遍历+深度优先遍历+ 广度优先遍历(层次遍历)

吃可爱长大的小学妹 提交于 2020-02-07 10:36:43
文章目录 7.2. 二叉树的遍历 二叉树的遍历 深度优先遍历 广度优先遍历(层次遍历) 7.2. 二叉树的遍历 二叉树的遍历 树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)。那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历, 深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。 深度优先遍历 对于一颗二叉树,深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。 那么深度遍历有重要的三种方法。这三种方式常被用于访问树的节点,它们之间的不同在于访问每个节点的次序不同。这三种遍历分别叫做先序遍历(preorder),中序遍历(inorder)和后序遍历(postorder)。我们来给出它们的详细定义,然后举例看看它们的应用。 先序遍历 在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树 根节点->左子树->右子树 def preorder ( self , root ) : """递归实现先序遍历""" if root == None : return print root . elem self . preorder (

IO(File 递归)

拈花ヽ惹草 提交于 2020-02-07 07:44:25
File概述 java.io.File类:文件和目录路径名的抽象表示形式。 用来描述电脑中文件,文件夹,以及路径类 常用的3个和File有关的单词: file:文件 directory:文件夹(目录) path:路径 File是一个与系统无关的类 File类的3个重载的构造方法 路径: window系统的目录分隔符是一个\ java中的目录分隔符是:\\或者/ 路径的分类 : 绝对路径 :以盘符开始的路径 例如:D:\\ase\\20170514\\day10 D:\\Work_EE_266\\day10\\src 相对路径: 相对于当前项目来说,路径编写的时候可以省略盘符到项目之间的路径 D:\\Work_EE_266\\day10-->src 注意:路劲不区分大小写的 File(File parent, String child) 传递路径,传递 File 类型父路径,字符串类型子路径 好处:父路径是 File 类型,父路径可以直接调用 File 类的方法 File(String parent, String child) 传递路径,传递字符串类型父路径,字符串类型的子路径 好处:单独操作父路径和子路径,使用起来比较灵活,可以把路径单独作为参数传递过来 File(String pathname) 传递路径名:可以写文件夹,也可以写到一个文件 c:\\abc c:\\abc\

[LeetCode] 426. Convert Binary Search Tree to Sorted Doubly Linked List 将二叉搜索树转为有序双向链表

拜拜、爱过 提交于 2020-02-07 07:07:23
Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right pointers as synonymous to the previous and next pointers in a doubly-linked list. Let's take the following BST as an example, it may help you understand the problem better: We want to transform this BST into a circular doubly linked list. Each node in a doubly linked list has a predecessor and successor. For a circular doubly linked list, the predecessor of the first element is the last element, and the successor of the last element is the first element. The figure below shows the circular doubly linked

C++:阶乘之和

倖福魔咒の 提交于 2020-02-07 06:48:34
题目描述 给定一个非负整数n,请你判断n是否可以由一些非负整数的阶乘相加得到。 输入 有若干组数据。每行一个整数n,保证n<1000000。以负数结束输入。 输出 对于每组数据输出一行,若可以则输出‘YES’,否则输出‘NO’。 样例输入 9 -1 样例输出 YES 因为n<10^7,并且0!+1!+2!+3!+……+10!>10 ^7,那么我们可以定义一个a数组专门来装0到10的阶乘。笔者的在线题库中写的是“非负整数”,有些数据也要加上非负整数0!,否则就错了。因此考虑的时候,要从0开始考虑。0!=1。 我用了一个递归程序来完成,是一个bool型的递归函数。对于一个数据ans,加上a[i]后再递归枚举所有小于i的a[i],就可以找出所有的可能。 为了简洁时间复杂度,我首先找出了小于n的a[i],i最大的值,从i开始往小递归。 题目还要注意一点,是用复数结束输入的,避免输出超限要把输入放在while里面。 在找i的过程中,a[i]等于n就直接输出并continue吧。 不多废话,贴代码(Ctrl c+Ctrl v的朋友看这里): # include <bits/stdc++.h> using namespace std ; int p = 1 , i , n ; int a [ 11 ] = { 1 , 1 , 2 , 6 , 24 , 120 , 720 , 5040 ,

递归手稿

房东的猫 提交于 2020-02-07 05:49:36
#递归的宏观含义 递归,按照百度给出的定义,按照某一包含有限步数的法则或公式对一个或多个前面的元素进行运算。两个需要注意的地方,第一个是法则和公式是有限步数,所以进行一次需要有限的时间,第二个就是需要对前面的元素进行运算。 #递归的步骤 递归的实际应用其实很简单,就简单的两步: 第一步,找到跳出条件。你要知道,计算机是可以进行有限步骤的操作,但可以重复这样的步骤无数次,所以我们必须对所有的函数进行一视同仁,但可以直观的知道,递归总有结束的时候,所以在过程中的递归和最后一步的递归中是不同的,这就用到了判断。如果是最后一步,则执行跳出操作,如果不是,就继续进行操作,之后再继续进行递归。 第二步,找到每一步之间的联系,即递归表达式,可以说,除了判断以及必要的操作,剩下的都是递归表达式了,即上一状态和下一状态的联系。 来源: CSDN 作者: 林井寒 链接: https://blog.csdn.net/Linjinghanzero/article/details/104128571

递归和动态规划裸题分析

那年仲夏 提交于 2020-02-07 04:02:12
递归和动态规划 裸题如下: https://www.luogu.com.cn/problem/P1060 递归 递归的思路如下: 思考递归边界。 确定最后应该向上层返回什么东西(例如这里向上层返回的就是权重值) 思考应该做什么重复的事(例如这里就是对是否买玩具做判断)。 思考应该向下面传递什么参数(例如这里就是(玩具数组索引,兜里剩的钱,当前已经攒了多少权重)) 完成以上思路很轻松就能写出以下代码。 import java.util.*; public class Main{ static int N,m; static int v[],w[]; static int _get(int deep,int money,int value){ if(deep==-1){ return value; } if(money<v[deep]){ return _get(deep-1, money, value); } int l = _get(deep-1, money, value); int r = _get(deep-1, money-v[deep], value+w[deep]); return r>l?r:l; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); m = sc

[数据结构与算法]第6章 递归

偶尔善良 提交于 2020-02-07 02:28:41
个人博客文章地址 文章目录 6.1 递归需要遵守的重要规则 6.2 递归-迷宫问题 6.3 递归-八皇后问题(回溯算法) 6.1 递归需要遵守的重要规则 执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 方法的局部变量是独立的,不会相互影响, 比如n变量 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据. 递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError,死龟了:) 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。 6.2 递归-迷宫问题 说明: 小球得到的路径,和程序员设置的找路策略有关即:找路的上下左右的顺序相关 再得到小球路径时,可以先使用(下右上左),再改成(上右下左),看看路径是不是有变化 测试回溯现象 思考: 如何求出最短路径? 代码实现: public class MiGong { public static void main ( String [ ] args ) { // 先创建一个二维数组,模拟迷宫 // 地图 int [ ] [ ] map = new int [ 8 ] [ 7 ] ; // 使用1 表示墙 // 上下全部置为1 for ( int i = 0 ; i < 7 ; i ++ ) { map