
DataStructure&Algorithms
文章平均质量分 66
arhaiyun
这个作者很懒,什么都没留下…
展开
-
重合区间最长的两个区间段SegmentOverlap
在一维坐标轴上有n个区间段,求重合区间最长的两个区间段。【问题来源于v_JULY_v的博客:http://blog.youkuaiyun.com/v_july_v/article/details/6803368】第一部分:思路1. 对N个区间排序,排序的规则为:先按区间的开始点从小到大排,若开始点相同,则再按结束点排例如:对于区间[1,3],[2,3],[1,4]排序后的结果是:[1,原创 2013-09-29 20:32:38 · 1250 阅读 · 0 评论 -
C++ 约瑟夫环问题
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 /*** 约瑟夫环:* 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又原创 2013-09-26 21:48:06 · 7068 阅读 · 1 评论 -
KMP算法解析
KMP算法 KMP算法之所以叫做KMP算法是因为这个算法是由三个人共同提出来的,就取三个人名字的首字母作为该算法的名字。其实KMP算法与BF算法的区别就在于KMP算法巧妙的消除了指针i的回溯问题,只需确定下次匹配j的位置即可,使得问题的复杂度由O(mn)下降到O(m+n)。 在KMP算法中,为了确定在匹配不成功时,下次匹配时j的位置,引入了next[]数组,next[j]的值表示P原创 2013-09-25 10:09:58 · 910 阅读 · 0 评论 -
DFS深度优先搜索简单案例:Coin解决方案
2012创新工场校园招聘的一道编程算法题:有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱,求有多少种组合可以组合成n分钱? /*** Coin Permutation* 有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱,求有多少种组合可以组合成n分钱?* @author arhaiyun* Date: 2013-09-24*/原创 2013-09-24 15:43:57 · 1084 阅读 · 1 评论 -
BigNumberPlus大数加法
/*BigNumberPlus(char* strNumLeft, char* strNumRight)@author arhaiyun*/#include "stdafx.h"#include #include #include using namespace std;char* BigNumberPlus(char* strNumLeft, char* strNumRig原创 2013-09-16 00:47:43 · 1549 阅读 · 0 评论 -
Trie 树(又称字典树,单词查找树)
Trie 树, 又称字典树,单词查找树。它来源于retrieval(检索)中取中间四个字符构成(读音同try)。用于存储大量的字符串以便支持快速模式匹配。主要应用在信息检索领域。 Trie 有三种结构: 标准trie (standard trie)、压缩trie、后缀trie(suffix trie) 。 最后一种将在《字符串处理4:后缀树》中详细讲,这里只将前两种。原创 2013-09-23 02:14:27 · 12708 阅读 · 2 评论 -
快慢指针,链表的排序
sougou校园招聘中某一道编程题实现一个队链表排序的算法,C/C++可以使用std::list,Java使用LinkedList要求先描述算法,然后再实现,算法效率尽可能高效。/*SortLinkList对链表的排序操作@author arhaiyudate:2013/09/21*/#include "stdafx.h"#include #inclu原创 2013-09-21 19:21:48 · 1790 阅读 · 1 评论 -
char* m_strcat(char* dst, char* src);
/*char* m_strcat(char* dst, char* src);@author arhaiyun*/#include"stdafx.h"#include#includeusing namespace std;char* m_strcat(char* dst, const char* src){ assert(dst != NUL原创 2013-09-12 23:45:20 · 2012 阅读 · 0 评论 -
atoi函数 int m_atoi(char* str)
/*m_atoi@author arhaiyun*/#includebool g_bInvalid = false;int m_atoi(char* str){ assert(str != NULL); long long result = 0; while(*str == ' ' || *str == '\n' || *str == '\t') str++原创 2013-09-10 22:29:46 · 1375 阅读 · 0 评论 -
BinaryTreeRelatedOperations
#include#include#include#includeusing namespace std;typedef struct BiTreeNode{ int m_nValue; struct BiTreeNode* m_pLeft, m_pRight;}BiTreeNode, *BiTreeList;class BiTree{ static int leave原创 2013-09-10 00:05:38 · 617 阅读 · 0 评论 -
MaxLenSubString最长公共子串
最长公共子串(LCS)找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。其实这又是一个序贯决策问题,可以用动态规划来求解。我们采用一个二维矩阵来记录中间的结果。这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"ba"或"ab") b a bc 0 0 0a 0 1 0原创 2013-09-16 02:12:31 · 1503 阅读 · 0 评论 -
C++面试:字符串处理专题(一)
/*[1]. atoi 将给定的字符串转换为数字* int m_atoi(char *strNum)* @author arhaiyun**/bool g_bInvalidInput = false;int m_atoi(char *strNum){ if(*strNum == '\0') { g_bInvalidInput = true; return 0; }原创 2013-10-06 01:32:02 · 1661 阅读 · 0 评论 -
带权有向图单源最短路径(Dijkstra算法)
单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。一.最短路径的最优子结构性质该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。假设P(i,j)={Vi.原创 2013-09-30 01:17:42 · 19494 阅读 · 1 评论 -
求最小生成树,普里姆(Prim)算法
1、 相关概念1)生成树 一个连通图的生成树是它的极小连通子图,在n个顶点的情形下,有n-1条边。生成树是对连通图而言的,是连同图的极小连通子图,包含图中的所有顶点,有且仅有n-1条边。非连通图的生成树则组成一个生成森林;若图中有n个顶点,m个连通分量,则生成森林中有n-m条边。2)和树的遍历相似,若从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历原创 2013-10-01 02:09:27 · 2482 阅读 · 0 评论 -
堆排序HeapSort算法学习
在程序设计相关领域,堆(Heap)的概念主要涉及到两个方面:一种数据结构,逻辑上是一颗完全二叉树,存储上是一个数组对象(二叉堆)。 垃圾收集存储区,是软件系统可以编程的内存区域。 本文所说的堆,指的是前者。堆排序的时间复杂度是O(nlgN),与快速排序达到相同的时间复杂度。但是在实际应用中,我们往往采用快速排序而不是堆排序。这是因为快速排序的一个好的实现,往往比堆排序具有更好的表现原创 2013-09-25 11:53:28 · 757 阅读 · 0 评论 -
KMP字符串模式匹配详解
在介绍KMP算法之前,先介绍一下BF算法。一.BF算法BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。举例说明:S: ababcababaP: ababa BF算法匹配的步骤如下i转载 2013-09-24 21:53:58 · 618 阅读 · 0 评论 -
DFS深度优先搜索案例:马戏团叠罗汉
2012创新工场校园招聘的一道编程算法题:马戏团里有个叠罗汉的表演,为了便于美观,下面的人身高和体重都要大于上面的人。现在知道n个演员的身高和体重,请问最多能叠多少层?设计思路:首先生成一个有向图map,用连接矩阵的方式来表示。map[i][j]==1表示第i个人上面可以放第j个人。然后开始对每个人进行dfs深度搜索,这个图中不可能有环。所以对于每个人来说就是一棵树,搜索树的高度。原创 2013-09-24 17:09:08 · 1811 阅读 · 1 评论 -
数组分割问题
题目概述:有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。/*ArrayPartitionint data[] = {1, 5, 7, 8, 9, 6, 3, 11, 20, 17};将一个有2n个元素的数组分割成元素个数相等(n)的两部分,使得两部分的和值最接近@author arhaiyundate:201原创 2013-09-24 01:20:25 · 1047 阅读 · 0 评论 -
0-1背包问题
背包系列之0-1背包问题问题描述:有N件物品和一个容量为V的背包。第i件物品的花费是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路:这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=ma原创 2013-09-23 03:52:51 · 806 阅读 · 0 评论 -
字符串中重复出现的最长字串-后缀树思想
/*字符串中重复出现的最长字串MaxlenRepeatSubString.cppshanghai zilaishui laizi haishanghaioutput:shanghai@author arhaiyundate:2013/09/23*/#include "stdafx.h"#include#include#include #include #include原创 2013-09-23 03:41:38 · 1014 阅读 · 0 评论 -
字符串最短距离CalculateStringDistance(递归 or 动态规划)
/*CalculateStringDistance许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程度。我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:1.修改一个字符(如把“a”替换为“b”)。2.增加一个字符(如把“abdd”变为“aebdd”)。3.删除一个字符(如把“travelling”变为“traveling”)。原创 2013-09-21 10:49:46 · 1967 阅读 · 0 评论 -
Queen 八皇后问题 回溯经典解法
/*八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。@原创 2013-09-19 00:55:12 · 776 阅读 · 0 评论 -
MaxIncreaseSubString最长递增子序列
最长递增子序列又叫做最长上升子序列;子序列,正如LCS一样,元素不一定要求连续。本节讨论实现三种常见方法,主要是练手。题:求一个一维数组arr[i]中的最长递增子序列的长度,如在序列1,-1,2,-3,4,-5,6,-7中,最长递增子序列长度为4,可以是1,2,4,6,也可以是-1,2,4,6。方法一:DP像LCS一样,从后向前分析,很容易想到,第i个元素之前的最长递增子序原创 2013-09-16 10:47:26 · 716 阅读 · 0 评论 -
strcpy函数的实现
/*my strcpy@author arhaiyun*/#include#includechar* my_strcpy(char* dst, char* src){ assert((dst != NULL) && (src != NULL)); char* ret = dst; int length = str(src) + 1; // while((*dst++原创 2013-09-10 18:54:43 · 678 阅读 · 0 评论 -
二叉树非递归遍历算法Binary Tree Traverse methods
/*Binary Tree Related Operations@author arhaiyun*/#includeusing namespace std;typedef int DataType;typedef struct BiTreeNode{ DataType m_nValue; struct BiTreeNode m_pLe原创 2013-09-10 18:00:57 · 929 阅读 · 0 评论 -
查找包含有序链表元素最小取值范围SearchMinPair
有k个有序的链表,请编写一个函数找到一个Pair满足以下条件:1. 每个链表都至少有一个数包含在Pair范围内;2. 这个Pair所表示的范围是所有满足条件的Pair中最小的例如,k = 3List 1: [5, 8, 15, 25, 36]List 2: [0, 4, 18, 50, 100]List 3: [3, 7, 20, 30, 45]返回的Pair是(3原创 2013-12-26 22:40:10 · 1128 阅读 · 0 评论