数据结构与算法
文章平均质量分 80
zhaopengnju
这个作者很懒,什么都没留下…
展开
-
最长公共子串和最长公共子序列
求解左边矩阵对角上连续出现的1的个数也就是求解右边矩阵中的最大值int longest_common_substring(const char* str1, const char* str2){ int len1 = strlen(str1), len2 = strlen(str2); int *pd = new int[len1]; memset(pd, 0, le原创 2016-08-19 23:19:41 · 402 阅读 · 0 评论 -
二叉树递归/非递归遍历
递归遍历//前序遍历void preorder(TreeNode *root, vector &path){ if(root != NULL) { path.push_back(root->val); preorder(root->left, path); preorder(root->right, path); }}原创 2016-08-09 11:27:01 · 310 阅读 · 0 评论 -
非递归求取二叉树的最大/小深度
分层遍历的思路:二叉树分层遍历用到的是BFS(广度优先搜索),显然这必须维护一个队列。但是一个队列只能得到遍历结果,并不能一层一层分开,所以必须使用两个队列curr和next,curr保存当前层的所有结点指针,next保存下一层的结点指针,遍历的过程就是出队列的过程,在对curr出队列的同时将推出来的结点的非空左右子结点压入队列next,直到为空那么当前层遍历完毕,同时下一层的所有结点指针也保原创 2016-08-09 11:16:25 · 1970 阅读 · 0 评论 -
子集问题一网打尽
问题一:假设一个整数集合中不包含重复元素,求这个集合的所有子集(包括空集和本身)一、子集就是在当前集合中选择N(N>=0)个元素,重新构成的另一个集合。那么对于当前元素我都可以选或者不选,重复这个子过程,那么子集便选择好了,很容易想到递归。原创 2016-05-16 19:24:45 · 662 阅读 · 0 评论 -
字典(trie)树的应用与实现
字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。常见的可以使用字典树解决的问题举例:1、已知N个单词,对于每一个单词,判断它有没有出现过,如果出现了,求第一次出现在第原创 2016-05-26 22:31:37 · 489 阅读 · 0 评论 -
堆排序
堆数据结构是一个完全二叉树,父结点值都大于子结点值(都小于子结点值)。用数组表示堆(0,...,size-1),根节点的下标为0,对于任意一个结点i,其左子结点为2*i+1, 右子结点为2*i+2。堆中最后一个非叶子结点的下标为size/2-1。//例程中是建一个大头堆templatevoid adjustHeap(T data[], int start, int end)原创 2016-05-30 11:23:10 · 291 阅读 · 0 评论 -
图的最短路径问题
主要是代码,代码中加了很多注释,相关原理很容易找到,这里主要展示代码实现。原创 2016-06-05 21:41:27 · 390 阅读 · 0 评论 -
0-1背包问题与数组分割问题
动态规划思想的应用很广泛,利用0-1背包问题的思路求解数组分割问题的方法比较直观。原创 2016-06-13 13:51:35 · 887 阅读 · 0 评论 -
二叉树的最大路径和与最远结点距离
首先确定一下单路径的定义:某个结点的单路径就是只经过该结点且不同时包含其左右子树上的结点的路径一、求连接二叉树的任意两个结点的路径的最大和分析:对于二叉树上的每一个结点,求出经过它的路径的最大和,并更新这个最大和即可。经过它的最大和路径可能有三种情况:1、其左子结点的最大单路径和大于0,且其右子结点的最大单路径和大于0,那么经过该结点的最大和路径通过该结点跨过左右子树2、其左子原创 2016-06-25 20:58:19 · 4365 阅读 · 0 评论 -
最短摘要生成
《编程之美》中对最短摘要生成问题的描述不是很清晰,事实上这个问题可以抽象成已知一个长字符串str和一个字符串数组strs,希望在str中找到一个包含字符串数组中的所有元素的最短子串。当然,这个问题可以更加简化为已知两个字符串src和obj,在src中找出包含obj中所有字符的最短子串。这个问题可以分成2个子过程:步骤1:初始化,定义两个指针pBegin和pEnd指向src的首部,pEnd向后移原创 2016-05-18 14:12:41 · 431 阅读 · 0 评论 -
数组最长递增子序列
int longest_increase_seq1(const vector& nums){ vector max_lens(nums.size(), 1);//max_lens[i]表示数组nums[0,...,i]最长递增子序列的长度 for (int i = 0; i < nums.size(); ++i) { int max_len = 0;原创 2016-08-21 19:50:15 · 372 阅读 · 0 评论