- 博客(194)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 递归与动态规划---最长递增子序列问题
问题: 给定数组arr,返回arr的最长递增子序列基本思路: 首先介绍时间复杂度为O(N^2)的方法。具体过程如下:生成长度为N(arr的长度)的数组dp,dp[i]表示在以arr[i]结尾的情况下,arr[0…i]中的最长子序列。dp[0]表示以arr[0]结尾的情况下最长子序列,只有它自己,设为1对于dp的其他位置,从左到右依次遍历,假设遍历到i,首先在arr[0…i-1]中找到比
2017-08-13 00:03:45 4746
原创 递归与动态规划---换钱的方法数
问题: 给定数组arr,arr中所有的值都为整数且不重复。每个值代表一种面值的货币,每种货币有无数张,再给定一个整数aim代表要找的钱数,求换钱的方法有多少种。 基本思路: 这道题的经典之处在于它可以体现暴力递归、记忆搜索、动态规划之间的关系,并可以在动态规划的基础上再进行一次优化。 首先介绍暴力递归的方法。如果arr = [5, 10, 25, 1],aim = 1000,分析过程如
2017-08-12 16:55:35 1900
原创 递归与动态规划---换钱的最少货币数(每种货币只有一张)
题目: 给定一个数组arr,arr中所有的值都为正数且不重复,每个值代表一种面值的货币,每种面值的货币只有一张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数。 基本思路: 生成dp数组,数组的每一行和每一列可以先确定,其他的位置dp[i][j] = min(dp[i-1][j], dp[i-1][j-arr[i]]+1)#python3.5#经典动态规划实现def
2017-08-12 00:18:12 779
原创 递归与动态规划---换钱的最少货币数(每种货币有无数张)
题目: 给定一个数组arr,arr中所有的值都为正数且不重复,每个值代表一种面值的货币,每种面值的货币有无数张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数。 基本思路: 生成dp数组,数组的每一行和每一列可以先确定,其他的位置dp[i][j] = min(dp[i-1][j], dp[i][j-arr[i]]+1)#python3.5#经典动态规划实现def mi
2017-08-12 00:15:12 3249 1
原创 递归与动态规划---矩阵的最小路径和
【题目】 给定一个矩阵m,从左上角开始每次都只能向下或者向右走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有路径中最小的路径和。【基本思路】 生成和m同样大小的矩阵dp,dp[i][j]的值表示从左上角走到位置(i, j)的最小路径和,矩阵的第一行和第一列的值可以先确定,其他的位置dp[i][j]的值等于min(dp[i-1][j], dp[i][j-1...
2017-08-12 00:06:58 944
原创 递归与动态规划---斐波那契系列问题的递归,动态规划与矩阵乘法
【题目】给定整数N,返回斐波那契数列的第N项假设农场中成熟的母牛每年只会生一头小母牛,并且永远不会死。第一年农场有1只成熟的牛,从第二年开始,母牛开始生小母牛。每只小母牛3年之后 成熟又可以生小母牛。给定整数N,返回N年后牛的数量。【基本思路】 原问题。O(2^N)的方法。斐波那契数列为1,1,2,3,5,8……,也就是除第一项和第二项以外,对于第N项,有F(N) = F(N-
2017-08-11 23:55:43 1220
原创 二叉树问题---统计完全二叉树的节点个数
基本思路: 可以利用完全二叉树的性质,首先判断头节点的右子树的最左节点是否和头节点的最左节点在同一层。 如果在的话,说明头节点的左子树是一棵满二叉树,可以用公式计算出左子树的节点个数,再加上头节点,也就是(2^h-1)+1,接下来再计算右子树的个数,可以用递归的方式求出来。 同理,如果头节点的右子树的最左节点和头节点的最左节点不在同一层,则右子树是一棵满二叉树,可以用公式计算出右子
2017-08-11 23:46:47 1018 1
原创 二叉树问题---统计所有可能的二叉树结构的种数
问题: 给定一个整数N,如果N<1,代表空树结构,否则代表中序遍历的结果为{1,2,3,…,N}。请返回可能的二叉树结构有多少。 基本思路: 假设num[n]代表n个节点的搜索二叉树有多少种可能。假设序列{1 , …, i , … , N},如果以i作为头结点,i的左子树有i-1个节点,所以可能的结构有num[i-1]种,右子树有N-i个节点,所以有num[N-i]种可能,故以i作为头
2017-08-11 23:35:00 1305
原创 二叉树问题---通过先序和中序数组生成后序数组
基本思路: 根据当前的先序和中序数组,设置后序数组最右边的值,然后划分出左子树的先序、中序数组,以及右子树的先序、中序数组,先根据右子树的划分设置好后序数组,再根据左子树的划分,从右边到左边依次设置好后序数组的全部位置#python3.5#通过先序和中序数组生成后序数组def preInToPos(pre, mid): def preInPos(pre, pi, pj, mid,
2017-08-11 23:20:23 986
原创 二叉树问题---先序,中序,和后序数组两两结合重构二叉树
注意: 如果一棵二叉树除叶节点之外,其他的节点都有左孩子和右孩子,这样的树才能被先序和后序数组重建#python3.5#先序,中序数组重构二叉树def preInToTree(pre, mid): def preIn(pre, pi, pj, mid, mi, mj, map): if pi > pj: return None
2017-08-11 23:13:42 485
原创 二叉树问题---二叉树节点间的最大距离
问题: 从二叉树节点A出发,可以向上或者向下走,但沿途的节点只能经过一次,当到达节点B时,路径上的节点数叫做A到B的距离。基本思路: 一个以h为头的树上,最大的距离只可能来自以下三种情况:h左子树上的最大距离h右子树上的最大距离h左子树上离h.left最远的距离+1+h右子树上离h.right最远的距离 三个值中的最大值就是整棵h树中最远的距离#python3.5#二叉树节点
2017-08-11 23:06:26 1116
原创 二叉树问题---在二叉树中找到两个节点的最近公共节点
问题:给定一棵二叉树的头节点head,以及这棵树中的两个节点o1和o2,请返回o1和o2的最近 公共祖先节点基本思路: 后序遍历二叉树,假设遍历到的当前节点为cur,首先依次遍历它的左孩子和右孩子,此时可能发生以下的四种情景:如果发现cur等于None,或者等于o1或者等于o2,返回cur如果左孩子和右孩子都为空,说明cur整棵子树上没有出现过o1和o2,返回None如果左孩子和右孩子
2017-08-11 22:45:28 933
原创 二叉树问题---通过有序数组生成平衡搜索二叉树
#通过有序数组生成平衡搜索二叉树def generateTree(arr): def generate(arr, start, end): if start > end: return None center = (start + end) // 2 head = TreeNode(arr[center])
2017-08-02 02:03:54 651
原创 二叉树问题---判断一棵树是否为完全二叉树
#判断一棵树是否为完全二叉树def isCBT(root): if not root: return True isLeaf = False queue = [] queue.append(root) while queue: root = queue.pop(0) left = root.left
2017-08-02 02:03:12 475
原创 二叉树问题---判断一棵树是否为搜索二叉树
#判断一棵树是否为搜索二叉树def isBST(root): if not root: return True res = True pre = None cur1 = root cur2 = None while cur1: cur2 = cur1.left if cur2:
2017-08-02 02:02:37 441
原创 二叉树问题---根据后序数组重建搜索二叉树
#根据后序数组重建搜索二叉树def postArrayToBST(arr): def arrayToBST(arr, start, end): if start > end: return None root = TreeNode(arr[end]) leftEnd = -1 rightStart =
2017-08-02 02:01:37 506
原创 二叉树问题---判断数组是否为某搜索二叉树的后序遍历的结果
#判断数组是否为某搜索二叉树的后序遍历的结果def isPostArray(arr): def isPost(arr, start, end): if start == end: return True leftEnd = None rightStart = None for i in range(en
2017-08-02 02:00:50 439
原创 二叉树问题---判断二叉树是否为平衡二叉树
#判断二叉树是否为平衡二叉树def isBalance(root): def judgeIsBalance(root, level, res): if not root: return level lH = judgeIsBalance(root.left , level+1, res) if res[0] == Fa
2017-08-02 01:59:39 524
原创 二叉树问题---判断t1树中是否有与t2树拓扑结构完全相同的子树
说明: 两种方法: 方法1: 对于t1的每棵子树,都去判断是否与t2树的拓扑结构完全一样,这个过程的实践复杂度是O(M),t1的子树共有N棵,所以时间复杂度为O(M*N) 方法2: 首先把t1树和t2树按照先序遍历的方式序列化,之后用KMP算法去判断t2Str是否是t1Str的子串即可。t1的序列化的过程是O(N),t2的序列化是O(M),KMP算法解决匹配问题的复杂度是O(M+N),所以
2017-08-02 01:57:23 1277
原创 二叉树问题---判断t1树是否包含t2树全部的拓扑结构
#判断t1树是否包含t2树全部的拓扑结构def isContain(t1, t2): def check(t1, t2): if not t2: return True if not t1 or t1.val != t2.val: return False return check(t1.lef
2017-07-31 02:52:49 763
原创 二叉树问题---寻找搜索二叉树中两个错误的节点
题目: 一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找出这两个错误的节点并返回。已知二叉树中所有节点的值都不一样,给定二叉树的头节点,返回一个长度为2的二叉树节点类型的数组errs。def getTwoErrorNode(root): errs = [None for i in range(2)] if not root:
2017-07-31 02:50:49 912
原创 二叉树问题---二叉树的按层打印和ZigZag打印
#按层打印def printByLevel(root): if not root: return print("Print binary tree by level") queue = [] queue.append(root) last = root level = 1 print("Level " + str(level)
2017-07-31 02:17:27 639
原创 二叉树问题---找到二叉树中的最大搜索二叉子树
题目: 给定一棵二叉树的头节点head,已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉树,并返回这棵子树的头节点。(注意子树的概念)def biggestSubBST(root): def findBiggestSubBST(root, record): if not root: record[0] = 0 reco
2017-07-31 02:14:46 746
原创 二叉树问题---在二叉树中找到累加和为指定值的最长路径长度
题目: 给定一棵二叉树的头节点head和一个32位整数sum,二叉树节点值类型为整型,求累加和为sum的最长路径长度。路径是指从某个节点往下,每次最多选择一个孩子节点或者不选所组成的节点链。def getMaxLength(root, K): def getLengthByPreOrder(root, K, preSum, level, length, map):
2017-07-31 02:09:11 1818
原创 二叉树问题---二叉树的序列化和反序列化
说明:二叉树被记录成文件的过程叫作二叉树的序列化,通过文件内容重建原来二叉树的过程叫作二叉树的反序列化#二叉树的序列化和反序列化(先序)def serialByPre(root): if not root: return '#!' res = root.val + '!' res += serialByPre(root.left) res += se
2017-07-31 01:57:42 691
原创 二叉树问题---打印二叉树的边界节点
问题:给定一棵二叉树的头节点,按照如下两种标准分别实现二叉树边界节点的逆时针打印。 标准一:1.头节点为边界节点2.叶节点为边界节点3.如果节点在其所在层中的最左边或最右边,那么也是边界节点标准二:1.头节点为边界节点2.叶节点为边界节点3.树左边界延伸下去的路径为边界节点4.树右边界延伸下去的路径为边界节点#标准一def printEdge1(root): def get
2017-07-31 01:55:42 1330
原创 二叉树问题---较为直观的打印二叉树
class TreeNode: def __init__(self, x): self.val = x self.left = None sele.right = Nonedef printTree(root): if not root: return print("Binary Tree: ") pr
2017-07-31 01:51:36 844 1
原创 二叉树的一些操作的代码实现
计算树的深度def getDepth(root): if not root: return 0 return 1 + max(getDepth(root.left), getDepth(root.right))计算树的带权路径长度def getWPL(root, depth=0): if not root: return 0 if no
2017-07-28 01:29:12 301
原创 二叉树问题---二叉搜索树查找、插入与删除的代码实现
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None查找def Find(root, x): if not root: print("The number {} is not found".format
2017-07-26 17:44:42 551 1
原创 八大经典排序算法基本思想及代码实现(Python、C++)
一.插入排序——简单插入排序基本思想:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。void insertSort(vector<int> &arr){ if(arr.size() <= 1) { return; } int j; int tmp; ...
2017-07-26 12:56:16 965
原创 二叉树问题---二叉树的前中后序的递归,非递归及Morris遍历
class TreeNode: def __init__(self, x): root.val = x root.left = None root.right = None创建二叉树def create_tree(root): element = input("Enter a key:") if element == '#':
2017-07-26 11:12:05 828
转载 Detection物体检测及分类方法总结(RFCN/SSD/RCNN/FastRCNN/FasterRCNN/SPPNet/DPM/OverFeat/YOLO)
这里搜集了一些关于物体检测的方法分析和介绍,看好哪个可以去详细研究一下,基本都有论文或代码的链接。这里是简述各种方法,下面有详细叙述方法选择:========DPM=========使用传统的slider window的方法 计算量非常大========OverFeat====改进了Alex-net,并用图像缩放和滑窗方法在test数据集上测
2017-04-09 00:52:06 972
原创 ubuntu下安装cuda,cudnn以及tensorflow(gpu)
在此之前,请先安装显卡驱动,如下修改之后重启电脑。安装cuda: 在官网下载cuda8.0,注意选择版本,我选择的是ubuntu16.04-deb(local)版本。 官网下面其实有安装教程,终端输入在: sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.de
2017-04-08 23:49:54 922
原创 使用virtualenv创建python虚拟环境
前几天安装了3.5版本的python,但是很多情况下我们需要使用python2.7,比如运行python2.7的代码或者安装python2.7的包之类的。这种情况下可以使用virtualenv来创建python虚拟环境。 首先安装virtualenv pip install virtualenv 或者 sudo apt-get i
2017-03-30 22:29:37 325
C语言常见的问题集
2018-05-22
python3 range()怎么倒着取数并且得到0值
2017-07-18
TA创建的收藏夹 TA关注的收藏夹
TA关注的人