数据结构与算法
文章平均质量分 52
盖世天才
这个作者很懒,什么都没留下…
展开
-
求两个不等长的有序数组的中位数
/** 求两个有序数组合并后的中位数,时间复杂度O(logn)*/#include #include using namespace std;void getMid(int *arr1, int n1, int *arr2, int n2){ int left = (n1+n2+1)/2+1; //1 2 3 4 5 6 7 8,此时left=righ原创 2013-08-11 17:21:40 · 2163 阅读 · 0 评论 -
线段树
先看下线段树的介绍,下面这个链接讲得还不错 http://hi.baidu.com/semluhiigubbqvq/item/be736a33a8864789f4e4ad18本文所讲的线段树和该文有微小区别,在该文中节点[0, 7]的左儿子为[0,3],右儿子为[4,7],不包含mid,而我们的线段树是包含的,即昨儿子为[0,3],右儿子为[3,7]。现在我们用线段树解决以下问题(小米笔试原创 2013-04-07 18:01:48 · 663 阅读 · 0 评论 -
我也来说说---数组的最大连续子数组和
问题:给定一个数组,求最大连续子数组和,并输出开始和结束坐标。例如{-1,2,3,-2,5,-7,4,8,-2,1},最大连续子数组为{2,3,-2,5,-7,4,8},最大和为13,从下标1开始,到下标7结束。一种思路是用DP。我们用一个数组max[]来记录以该元素为结尾的最大和,比如max[i]表示以arr[i]为结尾的最大连续子数组和。用一个begin[i]记录max[i]所对应的起始坐原创 2013-04-12 23:38:11 · 768 阅读 · 0 评论 -
找出树中两个节点的最低公共祖先
关于这道题,可以将其转化为求两个单链表的第一个焦点,这种做法需要两个栈,分别存储根节点到给定节点的路径。下面给出新的解法,利用后根遍历,代码如下:bool findCommonFather(treenode *root, char a, char b) //a不一定是左节点,b不一定是右节点{ bool left = false, right = false原创 2013-04-10 21:06:30 · 854 阅读 · 0 评论 -
Manacher算法解决最长回文子串问题---O(n)时间复杂度
转自:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824其实原文说得是比较清楚的,只是英文的,我这里写一份中文的吧。 首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长。这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文有多长, 这个算转载 2013-04-09 23:47:18 · 1468 阅读 · 0 评论 -
parent指针非递归不用栈中序遍历二叉树
p = T; while(p) { while(p->left) p = p->left; Visit(p); if(p->right) p = p->right; else { while(p->parent) {转载 2013-03-17 21:01:44 · 1678 阅读 · 0 评论 -
Trie树的建立与相关操作
先看下JULY大神关于Trie树的介绍 http://blog.csdn.net/v_july_v/article/details/6897097下面贴上源代码和结果图:#ifndef TRIE_H_INCLUDED#define TRIE_H_INCLUDED#include #include #include const int max = 128; //128个A原创 2013-03-28 17:31:36 · 1097 阅读 · 0 评论 -
一个数组里,除了三个数是唯一出现的,其余的都出现偶数个,找出这三个数中的任一个
题目:一个数组里,除了三个数是唯一出现的,其余的都出现偶数个,找出这三个数中的任一个。比如数组元素为【1, 2,4,5,6,4,2】,只有1,5,6这三个数字是唯一出现的,我们只需要输出1,5,6中的一个就行。下面是我的思路:这个数组元素个数一定为奇数,而且那要求的三个数一定不可能每一bit位都相同,所以我们可以找到其中一个bit位不同,可以把那三个数字分出来,而且可以很推出三个数肯定可以分到转载 2013-03-12 19:49:30 · 2138 阅读 · 0 评论 -
一道小米的关于柱状图求最大矩阵面积的题
题目描述:给一组非负的整数来表示一个柱状图,设计一个算法获得柱状图中最大矩形的面积。比如,输入如下数据:2,1,4,5,1,3,3 ,其中每个数表示一个柱状条的高度,柱状条的宽度为默认值1,则计算得最大矩形的面积为8,如下图所示。思路很简单,以一个柱形为中心往两边扫描,若旁边的柱形高度大于等于该柱形高度,则继续往两边扫。最后记录往旁边扫描了多少距离。比如图中的系列6,它的高度为3,然后原创 2013-03-12 19:27:15 · 2042 阅读 · 0 评论 -
一道IGT的关于RGB的笔试题
题目:一个字符串只有‘R’、‘G’、‘B’组成,如何让所有的‘R’出现在前面,所有的‘G’在中间,所有的‘B’在最后。要求:要求空间复杂度为O(1),只许遍历一遍字符串数组思路:维护三个游标 i、j、ki 指向开始, j 指向尾部,用于分别插入 R 、Bk 用于遍历,当发现是R时,与前面的 i 指的对象交换,i 后移;当发现是B时,与后面的 j指的对象交换,j前移 当转载 2013-03-12 01:44:04 · 1296 阅读 · 0 评论 -
计算1到N的十进制数中1的出现次数
问题描述:给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有"1"的个数。例如: N = 2,写下1,2。这样只出现了1个"1"。 N = 12,写下1,2,……,12,这样有5个"1"。 写一个函数f(N),返回1到N之间出现的"1"的个数,比如f(12) = 5。 假设N = abcde,这里a,b,c,d,e分别是十进制数N的各个数位上的数字。如果要计算百转载 2013-03-07 18:00:37 · 1484 阅读 · 0 评论 -
以空间换时间高效求素数算法
#include using namespace std;void find_primer(bool **primers, int n){ if(n <= 0) { cout<<"error!"<<endl; return; } *primers = new bool[n+1]; for(int i = 0; i < n+1; i++) {原创 2013-03-05 21:15:10 · 1302 阅读 · 0 评论 -
10个经典的字符串hash函数的C代码实现
以下总共给出了10种字符串hash函数,在上面的链接中可以找到各个Hash函数的描述,以及一些其它的关于hash函数的资料下载。这些hash函数各自的优缺点不详。其中,ELFHash函数是在unix系统中被广泛使用的,也是《算法艺术与信息学竞赛》中作者推荐的一个字符串hash函数。DEKHash函数是Knuth在其《The Art of Computer Programming》第三卷中引入的转载 2012-12-27 14:19:05 · 619 阅读 · 0 评论 -
一道算法题---把字符串内连续相同字符删除
题目描述:给定一字符串,删除连续相同的字符,如baiidu删除后为badu,baiiiau删除后为bu,baiiabdu删除后为du。要做这道题,大家可能第一想法就是找到连续相同字符,然后删除,把后续字符前移,然后继续。不断迭代,直到不再有连续字符为止。这种算法效率比较低。仔细观察发现,其实就是删除回文子串问题(但是还有些不一样,像bab这种回文串,按题目要求是不能删除的)。关于回原创 2013-04-10 01:00:24 · 6711 阅读 · 3 评论