随笔分类 - 算法&&数据结构
摘要:1. 求一个数组中后边的元素减去前边的元素的最大值例如数组 [3, 2, -1, 5, 4]后减前最大值为:5 - (-1)=6思路定义局部最大值tmpMax(初始化为负无穷),局部最小值tmpLow(初始化为数组第一个元素)从第二个元素开始遍历,如果(该元素-tmpLow )=0)只需比较该差值与...
阅读全文
摘要:问题判断一棵树是否是另一棵树的子树,如图思路问题分两步:找值相同的根结点(遍历解决)判断两结点是否包含(递归:值、左孩子、右孩子分别相同)树节点定义struct TreeNode{ int val; TreeNode *next; TreeNode(int v) : val(v),...
阅读全文
摘要:问题从1开始计数,计算倒数第k个结点的指针。例如:思路整着数到第k,然后前后一块往后走,前边的走到头,后边的极为倒数第k个结点,图示注意传入空指针k大于结点的个数代码ListNode* LastNNode(ListNode *root, int n){ if (root == NULL || ...
阅读全文
摘要:1. 二叉树中和为某一值的路径路径:从树的根节点到叶子节点经过的节点形成的路径,例如途中(10,5,4),(10,5,7),(10,12)满足和为22的路径有(10,5,7)、(10,12)参考代码void FindPath(TreeNode *root, vector &vec, int cur,...
阅读全文
摘要:定义结点struct MGraph{ int vexs[MAXVEX]; //顶点数 int arc[MAXVEX][MAXVEX]; //邻接矩阵 int numVertex, numEdges; //定点数 边数};深度优先遍历图示 参考代码bool visi...
阅读全文
摘要:二叉搜索树(BST)定义左孩子的值全部小于根节点,右孩子的值全部大于跟结点,左孩子、右孩子同样满足上述条件。假如有3个结点,总共有5个可能的BST: 1 3 3 2 1 \ / / / \ \ 3 ...
阅读全文
摘要:例子"abmadsefadd" 最长长度为5"avoaid" 最长长度为3思路空间换时间hashTable,起始位置设为beg。初始化全局最大值0。开辟字符数组,起初标为0。访问数组时如果该字符在hashTable对应的哈希值为1,则计算当前位置到beg的距离,并且把beg赋值为beg+1...
阅读全文
摘要:图示 A B C目的把A中的木板都放到C上(保证每次都是大下小上)思路——递归对于一共n个木板A上面n-1个通过C把木板放到B上A最下面一个木板放到C上此时A,B原来的关系调换,B上n-1块木板通过A放到C上参考代码#include using names...
阅读全文
摘要:已知二叉树的中序加前序或后续可以还原出二叉树(注:中序是必须知道的)前序:a b c中序:b a c后续:b c a1. 前序 + 中序思路对于例图中,由前序可知,第一个元素即a是根节点,从对应的中序中找到a。从而进一步知道其左边的b在左树中,其右边的c在右树中,这样结合前序递归可以还原出整个树。参...
阅读全文
摘要:题目输出上次字符串中字符的个数和字符最终的序列如下:1, 11, 21, 1211, 111221, ...n=1时,输出字符串"1"n=2时,输出上次字符串中字符的个数和字符,因为上次字符串有1个1,所以输出11n=3时,由于上次字符是11,有2个1,所以输出21n=4时,由于上次字符串是21,有...
阅读全文
摘要:需求单链表不可以用下标直接得到中间位置,可以采取一前一后(前面的走2步,后面的走一步)的方式实现。参考代码1 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} ...
阅读全文
摘要:要求给定树,与路径和,判断是否存在从跟到叶子之和为给定值的路径。比如下图中,给定路径之和为22,存在路径,因此返回true;否则返回false. 5 / \ 4 8 / / \ 11...
阅读全文
摘要:要求 给定一没有重复元素的旋转数组(它对应的原数组是有序的),求给定元素在旋转数组内的下标(不存在的返回-1)。例如有序数组为{0,1,2,4,5,6,7},它的一个旋转数组为{4,5,6,7,0,1,2}。元素6在旋转数组内,返回2元素3不在旋转数组内,返回-1分析 遍历一遍,可以轻松搞定...
阅读全文
摘要:0. 科普1. 为什么需要Bloom Filter2. 基本原理3. 如何设计Bloom Filter4. 实例操作5. 扩展0. 科普 Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求10...
阅读全文
摘要:图示算法描述把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列申请空间,使其大小为两个已经排好序的数组的长度之和把两个有序的数组通过比较桉顺序放到申请的空间中把在申请空间上存放的元素复制到原数组相应的位置上参考代码void merge(int *a, int beg, int m...
阅读全文
摘要:这个问题阮一峰老师讲的很清楚,链接这里我只贴一下我的C++实现代码:#include #include #include #include #include using namespace std;void BuildPatchMatchTable(int *partMatchTable, char...
阅读全文
摘要:实例替换前 abc def ghi替换后 abcdefghighi思路从前往后遍历字符串a,记录空格的个数SpaceNuma[i] = '' : SpaceNum++a[i]!='' : a[i-SpaceNum] = a[i]参考代码#include #include using namespace std;void RemoveSpace(char *a){ if(a == NULL) return; int len = strlen(a); int SpaceNum = 0; for(int i = 0; i 0) a[i -...
阅读全文
摘要:问题判断一数字序列是否为这些数字入栈的一种出栈方式(前提:栈中的数字不重复)例如假设入栈的序列为:1 2 3 4 5那么4 5 3 2 1为一种弹出序列, 4 3 5 1 2不是思路开辟一个辅助栈,模拟入栈出战过程(假设pa为入栈序列,pb为出战序列)pa中的元素依次压入辅助栈新压入的元素与弹出序列的栈底相同,辅助栈弹出,同时pb向上移动不相同了pa中的元素继续入辅助栈参考代码#include #include using namespace std;bool IsPopOrder(const int *a, const int *b, int lena, int lenb){ if(l...
阅读全文
摘要:思路参考代码#include using namespace std;void printNumAsClockwise(int a[][4], int row, int col){ if (row = left; --i) cout = up; --i) cout using namespace std;void printNumAsClockwise(int *a, int row, int col){ if (row = left; --i) cout = up; --i) cout << ...
阅读全文