数据结构
文章平均质量分 67
Nickqiao
这个作者很懒,什么都没留下…
展开
-
HDOJ1754(线段树)
题目:Problem Description很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。 Input本题目包含多组测试,请处理到文件结束。在每个测试的第一行,有原创 2016-06-28 19:48:52 · 792 阅读 · 0 评论 -
不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。分析:肯定用位运算,模拟加法时首先将各位相加不进位,然后再算进位,最后相加。例如5+17=22,首先各位相加得到12,然后算进位得到10,再相加得到22.各位相加不进位用异或计算,算进位先用与运算,再左移一位,然后重复直到没有进位。int Add(int num1,int num2){ int sum原创 2016-11-15 21:39:04 · 359 阅读 · 0 评论 -
二叉搜索树转化双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表要求排序可以想到中序遍历,把根节点的左右子树都转换成排序好的双向链表,再将根节点左子树的最大值,右子树的最小值与根节点相连。class Solution {public: TreeNode* Convert(TreeNode* pRootOfTree) { TreeNode *last原创 2016-10-30 13:21:01 · 283 阅读 · 0 评论 -
二叉树的深度
最大深度class Solution {public: int TreeDepth(TreeNode* pRoot) { if(pRoot==NULL) return 0; int l=TreeDepth(pRoot->left)+1; int r=TreeDepth(pRoot->right)+1;原创 2016-10-27 11:27:17 · 346 阅读 · 0 评论 -
已知二叉树前序中序遍历重建二叉树
中序遍历中根节点前的节点为左子树,根节点后的节点为右子树。class Soultion{public: struct TreeNode* reConstructBinaryTree(vector pre,vector in) { int inlen=in.size(); if(inlen==0) return NULL; vectorl原创 2016-09-30 22:48:54 · 474 阅读 · 0 评论 -
排序算法总结
选择,快速,希尔,堆排序为不稳定排序,插入,冒泡,归并,基数排序为稳定排序。插入排序:将数据分为有序部分和待排序部分,每次将待排序部分的第一个元素在有序部分中找到插入的位置,并将其插入。for(int i=1;i<length;i++){ for(int j=i-1;j>=0;j--){ if(data[j]>data[j+1]){ ...原创 2016-09-21 21:00:31 · 383 阅读 · 0 评论 -
两个栈实现队列
两个栈stack1,stack2,入队时压入stack1,出队时将stack1中的元素弹出压入stack2中,并将stack2栈顶弹出,完成出队。原创 2016-09-19 14:42:00 · 307 阅读 · 0 评论 -
哈夫曼编码
首先统计每个字母在字符串里出现的频率,我们把每个字母看成一个结点,结点的权值即是字母出现的频率,我们把每个结点看成一棵只有根结点的二叉树,一开始把所有二叉树都放在一个集合里。接下来开始如下编码:步骤一:从集合里取出两个根结点权值最小的树 a 和 b,构造出一棵新的二叉树 c,二叉树 c 的根结点的权值为 a 和 b 的根结点权值和,二叉树 c 的左右子树分别是 a 和 b。步骤二:将二叉树原创 2016-09-17 23:51:54 · 1183 阅读 · 1 评论 -
堆排序
从小到大排序,建立大根堆,每次将最后一个元素与堆顶交换,此时最大元素到堆尾,堆元素-1,自上而下维护大根堆,得到的数组即从小到大#includeusing namespace std;class Heap {private: int *data, size;public: Heap(int length_input) { data = new int[l原创 2016-09-17 21:52:48 · 316 阅读 · 0 评论 -
单调栈
题目:地上从左到右竖立着 n 块木板,从 1 到 n 依次编号,如下图所示。我们知道每块木板的高度,在第 n 块木板右侧竖立着一块高度无限大的木板,现对每块木板依次做如下的操作:对于第 i 块木板,我们从其右侧开始倒水,直到水的高度等于第 i 块木板的高度,倒入的水会淹没 ai 块木板(如果木板左右两侧水的高度大于等于木板高度即视为木板被淹没),求 n 次操作后,所有 ai 的和是多少。如图上原创 2016-08-09 21:24:56 · 548 阅读 · 0 评论 -
判断链表是否有环
题目:有一个链表,我们需要判断链表中是否存在环。有环则输出true,否则输出false。输入有多行,每行为由空格分隔的两个整数m和n,m是当前结点的数据,n代表当前结点的指针域指向第n个结点。n存在四种情形:①为-1,代表该结点的指针域指向NULL,输入结束;②指向该结点之前的结点,如第3个结点的指针域指向n = 2的结点;③指向自己,如第3个结点的指针域指向n = 3原创 2016-07-27 21:14:41 · 422 阅读 · 0 评论 -
链表部分逆置
题目:给定一个固定的单链表,输入两个数begin和end。将下标为begin到end之间的内容逆置。给定的单链表为:0->2->4->6->8->10->12->14->16->18测试数据确保begin和end不会超出单链表的长度范围,并且end>=begin样例输入2 4样例输出0->2->8->6->4->10->12->14->16->1原创 2016-07-27 20:57:16 · 628 阅读 · 2 评论 -
HDOJ2838(树状数组)
大意:求所有逆序数对的和分析:对于数a,他的逆序数对之和为:逆序对数*a+a之前比a大的数。开两个树状数组,一个求逆序对数,一个求和。代码:#include #include #include #include #define MAXN 100001using namespace std;struct tree{ int t; long long sum;}tree[M原创 2016-07-01 23:11:49 · 426 阅读 · 0 评论 -
HDOJ1556(树状数组)
题目:Problem DescriptionN个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a Input每个测试实例第一行为一个整数N,(N 当N = 0,输入结束。 Output每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。 Samp原创 2016-07-01 18:36:23 · 524 阅读 · 0 评论 -
HDOJ2689(树状数组)
大意:求逆序数分析:数据较小,可以用树状数组。数据大则用归并。用树状数组求逆序数时,数组tree代表数字x是否在序列中出现过,如果数字x已经存在于序列中,则tree[x]=1,否则tree[x]=0,此时query(x)返回值为在序列中比数字x小的元素的个数,如果序列中第i个元素的值为x,那么前i个元素中比x大的元素的个数为i-query(x)。代码:#include #include原创 2016-07-01 19:52:26 · 557 阅读 · 0 评论 -
HDOJ1166(线段树,树状数组)
题目:Problem DescriptionC国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃原创 2016-06-28 19:02:21 · 998 阅读 · 0 评论 -
KMP算法详解
一直以来对KMP算法理解的不是很透彻。看了左神的程序员代码面试指南后感觉基本明白了。我们都知道KMP算法最重要的是next数组,next[i]的含义是在match[i]之前的字符串match[0..i-1]中,必须以match[i-1]结尾的后缀子串(不能包含match[0])与必须以match[0]开头的前缀子串(不能包含match[i-1])最大匹配长度是多少。比如match="aaaab原创 2017-03-04 18:00:34 · 577 阅读 · 0 评论