
算法导论
文章平均质量分 94
fkyyly
这个作者很懒,什么都没留下…
展开
-
数据结构算法题/二叉树中两个节点的最近公共父节点
这个问题可以分为三种情况来考虑:情况一:root未知,但是每个节点都有parent指针此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点,这个方法很简单,不需要详细解释的。情况二:节点只有左、右指针,没有parent指针,root已知思路:有两种情况,一是要找的这两个节点(a, b),在要遍历的节点(root)的两侧,那么这个节点就是...转载 2018-12-25 15:33:33 · 1058 阅读 · 0 评论 -
数据结构算法题/合并两个排好序的单链表
原题 Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. 题目大意 合并两个排序链表并返回一个新的列表。合并之后的列表有序。解题思路 使用头结点ro...转载 2018-11-09 11:15:47 · 634 阅读 · 0 评论 -
数据结构算法题/判断一个数字是否是回文数
题目大意 判断一个数字是否是回访字数,不要使用额外的空间。 解题思路先逆序然后判断是否相等 为了不使用额外的空间,参考了其它的解决,那些解法看起来在isPalindrome方法中没有使用额外参数,但是却使用了方法调用,这个比一个整数消耗的空间更多 ,并没有达到题目的要求,是假的实现,所以本题依然采用一个额外的空间进行实现。 首先,负数不是回文数字,其次对数字进行逆转,123变...转载 2018-10-30 18:08:31 · 882 阅读 · 1 评论 -
数据结构算法题/最长回文子串
回文表示字符串正向和反向是相同的。例如a, aba, abccba一、暴力法最容易想到的就是暴力破解,求出每一个子串,之后判断是不是回文,找到最长的那个。求每一个子串时间复杂度O(N^2), 判断子串是不是回文O(N),两者是相乘关系,所以时间复杂度为O(N^3)。二、动态规划下面介绍动态规划的方法,使用动态规划可以达到最优的 O(n2) 复杂度。 令 dp[i][j] ...原创 2018-10-30 14:55:55 · 395 阅读 · 0 评论 -
数据结构算法题/有向图的最短路径问题Dijkstra
Dijkstra从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题时间复杂度o(n^2)用Dijkstra算法找出以A为起点的单源最短路径步骤如下,从最短路径开始找,而不是当前路径开始找。https://www.cnblogs.com/kex1n/p/4178782.html...原创 2018-10-24 17:49:49 · 3776 阅读 · 0 评论 -
数据结构算法题/字符串数组的最长公共前缀
题目: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。转载 2018-10-31 15:12:22 · 346 阅读 · 0 评论 -
数据结构/查找方法
1 顺序查找2 二分查找需要数据有序3 查找树3.1 二叉查找树3.1.1 定义和性质所谓二叉查找树(binary search tree , BST)或者是一棵空树;或者是具有以下性质的二叉树:⑴ 若它的左子树不空,则其左子树中所有结点的值不大于根结点的值;⑵ 若它的右子树不空,则其右子树中所有结点的值不小于根结点的值;⑶ 它的左、右子树都是二叉查找树总结:左小右大...原创 2018-10-26 16:09:02 · 3986 阅读 · 0 评论 -
数据结构/最长重复子串
基本方法、KMP算法求解、后缀数组求解求字符串的最长重复子串例如:aaaaaaaaabbbbcccaaassscvvv这里面的最长重复子串为aaaaaaaaa算法思路:算法时间复杂度(O(n))1. 将这一个字符串先转成char数组;2. 将这一char数组进行遍历3. 比较char数组中第i-1个与第i个的字符是否相等,如果不相等则进行截取字符串长度,然后将其进行比较,如...转载 2018-10-29 16:38:54 · 948 阅读 · 1 评论 -
数据结构/最长非重复子串的长度
给定一个字符串,找字符中的最大非重复子串。例如 “abcabcbb”最大非重复子串是“abc”,长度是3。“bbbbb” 最大非重复子串是b长度是1.思路:输出结果(list)中包含当前元素i,那么需要切割取原来list中的当前元素i之后的那些元素例如list为(abcdf),那么如果遇到c,那么更新后的list结果是(cdf)截取之后,再把当前元素加入到list中,比较新的list长度...原创 2018-10-29 15:38:00 · 542 阅读 · 0 评论 -
数据结构/K Sum求解方法
K sum的求和问题一般是这样子描述的:给你一组N个数字(比如 vector<int> num), 然后给你一个常数(比如 int target) ,我们的goal是在这一堆数里面找到K个数字,使得这K个数字的和等于target。注意事项(constraints):注意这一组数字可能有重复项:比如 1 1 2 3 , 求3sum, 然后 target = 6, 你搜的时候可能会...原创 2018-10-29 10:35:03 · 384 阅读 · 0 评论 -
数据结构算法题/图的生成树:Prim算法和Kruskal
1. 生成树在一个任意连通图G中,如果取它的全部顶点和一部分边构成一个子图G',即:V(G')=V(G)和E(G')⊆E(G)若同时满足边集E(G')中的所有边既能够使全部顶点连通而又不形成任何回路,则称子图G'是原图G的一棵生成树。连通图是n个点n-1条边。 在图G的一棵生成树G'中,若再增加一条边,就会出现一条回路。这是因为此边的两个端点已连通,再加入此边后,这两个端点间有两条路径...原创 2018-10-23 21:35:01 · 508 阅读 · 0 评论 -
图的深度优先遍历和广度优先遍历
1.深度优先遍历(DFS)(1)从某个顶点V出发,访问顶点并标记为已访问(2)访问V的其中一个邻接点(通常最左边的那个),如果没有访问过,访问该顶点并标记为已访问,然后再访问该顶点的邻接点,递归执行 先一直往后走,如果该顶点已访问过,退回上一个顶点,再检查该顶点的邻接点是否都被访问过,如果有没有访问过的继续向下访问,如果全部都访问过继续退回到上一个顶点,继续同样的步骤。 深...转载 2018-10-23 20:07:07 · 19252 阅读 · 0 评论 -
数据结构算法题/括号生成
这道题给定一个数字n,让生成共有n个括号的所有正确的形式,对于这种列出所有结果的题首先还是考虑用递归Recursion解。由于字符串只有左括号和右括号两种字符,而且最终结果必定是左括号3个,右括号3个,所以我们定义两个变量left和right分别表示剩余左右括号的个数。如果在某次递归时,剩余左括号的个数大于剩余右括号的个数,说明此时生成的字符串中右括号的个数大于左括号的个数,即会出现')(...转载 2018-11-09 17:13:13 · 337 阅读 · 0 评论 -
数据结构算法题/删除数组中重复元素
题目 给定一个排序的数组,将数组中的重复元素去掉,相同的只保留一个,并且返回数组新的元素个数,不要创建一个新的数组来保存结果。在常量时间内解决这个问题 解题思路 从第二个元素开始处理,记为当前处理的元素,如果当前元素与他的前一个元素相同就删除这个元素,如果不同就将它移动到正确的位置,返回最后数组元素个数。比如输入的数组为{1,2,3,3,4,5,5,6},则最后的数组为{1,2...转载 2018-11-09 18:18:42 · 2494 阅读 · 0 评论 -
数据结构算法题/数组中两个数相减(前面减后面)的最大值
数组中两个数相减(前面减后面)的最大值。解法一:O(n^2)就是一个很普通的方法。求出 数组中所有下标小的元素减去下标大的元素,找出其中的最大值即可。代码如下://O(N^2) 找出数组arr中两个数相减的最大值 public static int maxValueSub(int[] arr){ int max = 0; int sub; ...原创 2018-11-10 16:07:30 · 6372 阅读 · 5 评论 -
数据结构算法题/寻找数组中唯一出现两次的数
假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?这道题目在四月份腾讯实习生的二面时候被问到,当时压根就没有时间准备算法的东西,结果在那里胡说...转载 2018-12-16 16:35:19 · 1044 阅读 · 0 评论 -
数据结构算法题/两个已排序数组的交集和并集
两个已排序数组的交集和并集问题: 给你两个排序的数组,求两个数组的交集。比如: A = 1 3 4 5 7, B = 2 3 5 8 9, 那么交集就是 3 5.思路:1. 每一次从B数组中取一值,然后在A数组里逐个比较,如果有相等的,则保存。该算法复杂度为 O(MN). M, N 分别为数组 A B 的长度。2. 因为A B 都排过序,所以,每一次从B数组取值后,可以利用二分...转载 2018-12-09 15:02:29 · 667 阅读 · 1 评论 -
数据结构算法题/第一个出现一次的字符
在一个字符串中找到第一个只出现一次的字符。使用哈希LinkedHashMap(key是有序的),不能用HashMap(key是无序的)1 LinkedHashMap构建key是字符value就是count值2 查询LinkedHashMap...原创 2018-12-14 18:22:47 · 198 阅读 · 1 评论 -
数据结构算法题/单个字符串,两个字符串,多个字符串相关算法题
1 一个字符串1.1 最长回文子串https://blog.youkuaiyun.com/fkyyly/article/details/835417671.2 最长重复子串https://blog.youkuaiyun.com/fkyyly/article/details/835081681.3 最长非重复子串https://blog.youkuaiyun.com/fkyyly/article/details...原创 2018-12-14 16:49:07 · 354 阅读 · 0 评论 -
海量文本相似度匹配
1 词与词之间的匹配(主要用于分词,单词补全,模板匹配)1.1 一对一KMP1.2一对多前缀树1.3多对多给一个字典,再给一个m长的文本(m长的文本里面包含很多的词),问这个文本里出现了字典里的哪些字。1.3.1 方法一:使用HashMap复杂度是O(maxLengh(word)*length(str))这样和字典的大小没有关系1.3.2 方法二:AC自动机ht...原创 2018-12-14 10:41:37 · 2805 阅读 · 0 评论 -
数据结构算法题/有序矩阵查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,诶一列都按照从上到下递增的顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否包含了该整数。 例如下面的二维数组就是每行、没列都递增排序。如果在这个数组中查找数字7,则返回true(找得到);如果查找数字5,由于数组不含该数字,则返回false。1 2 8 9...转载 2018-12-13 22:09:31 · 342 阅读 · 0 评论 -
海量数据相似度计算之simhash和海明距离
SimHash定义SimHash是一种局部敏感hash,它也是Google公司进行海量网页去重使用的主要算法。传统的Hash算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上仅相当于伪随机数产生算法。传统的hash算法产生的两个签名,如果原始内容在一定概率下是相等的;如果不相等,除了说明原始内容不相等外,不再提供任何信息,因为即使原始内容只相差一个字节,所产生的签名也很可能差别很...转载 2018-11-25 21:55:30 · 5013 阅读 · 0 评论 -
数据结构算法题/求数组中大小最接近的两个元素的差
考虑下面这个算法,它求的是数值数组中大小最接近的两个元素的差。可对比看下求数组中两个元素差的最大值https://blog.youkuaiyun.com/fkyyly/article/details/83930343算法: MinDistance(A[0..n-1]) //输入:数字数组 A[0..n-1] //输出:数组中两个大小相差最...原创 2018-11-19 11:49:25 · 6576 阅读 · 8 评论 -
数据结构算法题/字符串按照单词翻转要求空间复杂度O(1)
/** * 先直接逆序,这样确保最后那个单词在前面了,只不过此时单词是逆序的 * 然后再对每个逆序的单词进行调整 */public class StringWordReverse { public String wordReverse(String str){ //在逆序之后的string之后补一个空格,为了统一处理方便 String temp =...原创 2018-11-16 11:24:00 · 989 阅读 · 0 评论 -
字符串匹配的三个算法(KMP+字典树+AC自动机)
字符串匹配的意思是给一个字符串集合,和另一个字符串集合,看这两个集合交集是多少。(1)若是都只有一个字符串,那么就看其中一个是否包含另外一个(一对一,KMP)https://blog.youkuaiyun.com/fkyyly/article/details/48007965(2)若是父串集合(比较长的,被当做模板)的有多个,子串(拿去匹配的)只有一个,就是问这个子串是否存在于父串之中(字典树则是...原创 2018-11-12 15:00:22 · 1575 阅读 · 1 评论 -
数据结构算法题/最大子矩阵(二维数组中和最大的连续子矩阵)
给定一个矩阵,都是整数,求出其中的最大子矩阵。可以将问题转换为求一维数组的最大子序列和的问题。具体见https://blog.youkuaiyun.com/fkyyly/article/details/83088247/** * 其实思想是控制新的子矩阵开始,按列相加变成一维数组,然后再求一维数组最大子序列的和, * 最后在多个最大子序列的和中返回最大的那个 * 然后对如上获取的不同子矩阵分别...原创 2018-11-15 21:28:45 · 2838 阅读 · 0 评论 -
数据结构算法题/括号匹配
使用栈的思想,左括号入栈,右括号出import java.util.Deque;import java.util.LinkedList;/** * 输入string中只能含有括号元素Java中有一个类Stack,用于表示栈,但这个类已经过时了。 * Java中没有单独的栈接口,栈相关方法包括在了表示双端队列的接口Deque中,主要有三个方法 */public class Sta...原创 2018-11-08 18:31:38 · 710 阅读 · 0 评论 -
Huffman树
不定长编码时必须采用前缀码或者分隔符。Huffman 树:它是由n 个带权叶子结点构成的所有二叉树中带权路径长度最小的二叉树,Huffman 树又称最优二叉树。构造Huffman 树的算法步骤如下:① 根据给定的 n 个权值,构造n 棵只有一个根结点的二叉树, n 个权值分别是这些二叉树根结点的权,F 是由这n 棵二叉树构成的集合;② 在 F 中选取两棵根结点树值最小的树作为左、右子树,构...原创 2018-10-23 16:09:36 · 1031 阅读 · 0 评论 -
数据结构算法题/树的遍历(深度优先和广度优先)
在编程生活中,我们总会遇见树性结构,这几天刚好需要对树形结构操作,就记录下自己的操作方式以及过程。现在假设有一颗这样树,(是不是二叉树都没关系,原理都是一样的)。此外二叉树可以递归的方法遍历。 1、深度优先英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。对于上面的例子来说深度优先遍历的结果...转载 2018-10-23 10:34:10 · 2248 阅读 · 0 评论 -
算法导论之快排
快速排序法原理也是用了分治法,主要原理是将数组A分为A[p..q-1] 和A[q+1..r],然后调整元素使得A[p..q-1]小于等于A[q],A[q]小于等于A[q+1..r]。然后不断的递归,到最后就排序完成。p--i是小于等于x的,i+1--j-1是大于等于x的,j--r是还未处理的i每次从list前面往后走(i只在满足条件的当前轮加)j是p到r的循环package so...原创 2014-03-02 21:19:10 · 854 阅读 · 0 评论 -
算法导论之桶排序
桶排序(bucket sort)假设输入数据服从均匀分布。平均情况下他的时间代价是O(n)。计数排序假设输入数据分布于一个小区间的整数,而桶排序则假设输入是一个随机过程产生的,该过程将元素均匀独立地分布于[0,1)区间上。 1.桶排序的基本思想 桶排序将[0,1)区间划分为n个相同的大小的子区间,这些子区间被称为桶。然后将n个输入元素分别放入各自的桶中。因为输入时均匀独立的,所以一般不会有很多...转载 2014-03-07 14:01:53 · 896 阅读 · 1 评论 -
希尔排序
直接插入排序在在本身数量比较少的时候情况下效率很高,如果待排数的数量很多,其效率不是很理想。按gap进行分组得到一个小组(a[i],a[i+gap])然后对小组进行排序 回想一下直接插入排序过程,排序过程中,我们可以设置一条线,左边是排好序的,右边则是一个一个等待排序,如果最小的那个值在最右边,那么排这个最小值的时候,需要将所有元素向右边移动一位。 是否能够减少这样的移位呢?...原创 2018-09-25 10:42:44 · 404 阅读 · 0 评论 -
冒泡排序
1、比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大(小)的数。3、针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序)。4、持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序。5、选择排序是每次选择最大(小)放在前面的位置...转载 2018-09-23 20:08:47 · 136 阅读 · 0 评论 -
数据结构算法题/KMP算法,一个字符串是否包含另外一个字符串
字符串匹配是计算机的基本任务之一。KMP算法:利用匹配失败得到的信息,来最大限度的移动模式串,以此来减少比较次数提高性能。相关的名词:搜索词是那个长的词模式串是那个短的词思路:如果已经匹配的长度是0,直接将搜索词后移一位。如果已经匹配的长度是1,如果此时不匹配了,直接将搜索词后移一位。如果已经匹配的长度大于1,如果此时不匹配了,直接将搜索词后移已匹配的字符数 - ...转载 2015-08-26 18:48:54 · 887 阅读 · 0 评论 -
算法导论之插入排序
插入排序就想打扑克一样,桌子上的扑克室乱的,我们抓到自己手里的扑克是按照数字顺序排行的。插入排序的思想是增量方法:在排好子数组A[1…j-1]后,将元素A[j]插入,形成排好序的子数组. 如下图: 伪代码INSERT-SORT(A) for j=2 to A.length key=a[j] i=j-1; while i>0 and A[i]>key ...原创 2014-02-21 15:35:54 · 803 阅读 · 0 评论 -
mergesort归并排序
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。分而治之 可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶...原创 2015-06-19 15:07:20 · 542 阅读 · 0 评论 -
算法导论之随机选择
package select;import java.util.Random;public class Randomized_Select { int Partition(int a[],int p,int r){ int x=a[r];//把每次数组A的最后一个元素作为主元 int i=p-1;//开始的时候将i 移动到数组的外面 for(int j=p;j<=r-原创 2014-03-07 17:58:37 · 1245 阅读 · 0 评论 -
算法导论之计数排序
1.计数排序是一种非常快捷的稳定性强的排序方法,时间复杂度O(n+k),其中n为要排序的数的个数,k为要排序的数的组大值。计数排序对一定量的整数排序时候的速度非常快,一般快于其他排序算法。但计数排序局限性比较大,只限于对整数进行排序。计数排序是消耗空间复杂度来获取快捷的排序方法,其空复杂度为O(K)同理K为要排序的最大值。2.计数排序的基本思想为一组数在排序之前先统计这组数中其他数小于这个数的...原创 2014-03-06 22:16:45 · 676 阅读 · 0 评论 -
算法导论之堆排序
堆排序主要是先建堆,转化为最大堆,每次把最大的一个(即最大堆的根节点)和最后一个交换,这样每次都把当前最大的一个放到了最后。堆排序算法中,最关键的就是构造初始堆。需要编写一个维护大顶堆性质的函数Max_Heapify。当输入一个数组L和一个下标i,然后调用Max_Heapify时,比较L[i]、L[left(i)]和L[right(i)]三者的大小;如果L[i]小于其孩子结点,就违背了大顶堆的...原创 2014-02-26 19:07:26 · 757 阅读 · 0 评论 -
算法导论之递归汉诺塔
public class Hanoi { int i=0; void sethanoi(int n,char a,char b,char c)//n个盘子。a,b,c三个柱子 { if (n == 1) {move(n, a, c); i++; } else {原创 2014-02-25 21:23:12 · 739 阅读 · 0 评论