算法与数据结构学习笔记
Horken Kason
朽木自雕
展开
-
队列实现栈,栈实现队列
两个队列实现栈: 每次进入一个队列,取出得时候,把所有元素进入另一个队列,只留下一个元素,以此实现栈的先进后出(FILO)。package algorithmByMySelf;import java.util.LinkedList;import java.util.Queue;/* 用两个队列实现一个栈 * * */public class twoQueueToS...原创 2019-01-04 00:15:04 · 213 阅读 · 0 评论 -
BFPRT算法
解决的问题:在一个数组中找到最小的k个数常规解法:1、排序,输出前k个数,时间复杂度O(n*log(n))。 2、利用一个大小为k的大根堆,遍历数组维持大根堆,最后返回大根堆就可以了,时间复杂度O(n*log(k))。BFPRT解法:利用快速排序的思路,选取一个划分值,小于这个数的放右边,等于这个数的放中间,大于这个数的放右边。如下图:这样...原创 2019-01-31 21:05:13 · 163 阅读 · 0 评论 -
如何翻转单链表和双向链表
package class_03;public class Code_07_ReverseList { public static class Node { public int value; public Node next; public Node(int data) { this.value = data; } } public static Node...原创 2019-01-16 17:21:11 · 299 阅读 · 0 评论 -
如何计算完全二叉树的结点数?
如何计算完全二叉树的结点数?要求:时间复杂度低于O(n),即不能直接遍历二叉树。答:从根节点开始,查看右子树的高度right_h与左子树的高度left_h的关系,如果right_h < left_h 说明右子树一定是满二叉树,左子树继续递归这个过程。如果right_h == left_h 说明左子树一定是满二叉树,右子树继续递归这个过程。对于满二叉树,有这个公式,如果树的高度为k,则...原创 2019-01-16 21:36:07 · 4727 阅读 · 0 评论 -
Morris遍历-如何用空间复杂度O(1)来遍历二叉树
参照和学习:https://www.cnblogs.com/AnnieKim/archive/2013/06/15/morristraversal.html解决的问题:如何使用空间复杂度O(1),来遍历二叉树。我们通常的办法:是递归或者利用栈的迭代,空间复杂度都为O(logN),虽然已经很完美,但是还有更加美丽和充满艺术感的Morris。Morris解法:首先要面临的问题是,O(1...原创 2019-02-01 21:23:31 · 1091 阅读 · 0 评论 -
哈夫曼编码拓展题
哈夫曼编码:参照:https://blog.csdn.net/FX677588/article/details/70767446https://blog.csdn.net/google19890102/article/details/54848262问题:一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的 金条,不管切成长度多大的两半,都要花费20个铜板。一群人想整分...原创 2019-01-29 20:44:31 · 2673 阅读 · 0 评论 -
路径最小问题
问题:给你一个二维数组,二维数组中的每个数都是正数,要求从左上角走到右下角,每一步只能向右或者向下。沿途经过的数字要累加起来。返回最小的路径经典的动态规划问题请记住这样一句话:每一个优美的动态规划,都来自原先暴力的尝试package class_08;public class Code_07_MinPath { public static int minPath1(int...原创 2019-01-29 21:25:21 · 174 阅读 · 0 评论 -
KMP
具体学习:请参照,讲解的非常详细:https://blog.csdn.net/v_july_v/article/details/7041827KMP解决的问题:字符串中查找。如:S(文本串)=‘aaab’,P(模式串)=‘aab’,在S中查找是否包含P。暴力的解法:遍历S的时候,匹配P,时间复杂度O(n*m),S 长度n,P 长度m。而KMP方法时间复杂度,O(n+m),与暴力解是...原创 2019-01-30 18:55:44 · 547 阅读 · 0 评论 -
Manacher
文章参考:https://segmentfault.com/a/1190000008484167江湖人称:马拉车算法解决的问题:求一个字符串中的最长回文。暴力的方法:遍历字符串,以当前字符为中心,向两边扩展直至不是回文。时间复杂度O(n^2)Manacher算法:是记录并利用以前遍历过的回文,巧妙的达到一个加速的效果。时间复杂度O(n)首先了解三个概念:(1)回文半径数组:...原创 2019-01-30 22:35:14 · 741 阅读 · 0 评论 -
常见树的总结
树BSTBinary Sort Tree:二叉查找树,或二叉搜索树,或二叉排序树性质:若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;左、右子树也分别为二叉查找树;没有键值相等的节点。**特点:**对二叉查找树的中序遍历,是升序的序列。查找的时间复杂度 O(logN),最...原创 2019-04-06 17:37:24 · 369 阅读 · 0 评论 -
如何判断是搜索二叉树与完全二叉树
1、搜索二叉树的定义:它是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。搜索二叉树可以方便的查找树中的最大值或最小值。如何判断一棵二叉树是否是搜索二叉树?答:只需要判断该二叉树的中序遍历是否从小到大有序,即升序。2、完全二叉树:...原创 2019-01-16 00:17:45 · 508 阅读 · 0 评论 -
平衡二叉树
平衡二叉树的定义:如果每一个节点的左子树和右子树的高度差不超过1,那么这可树就是平衡二叉树。判断一个树是否为平衡树,把握三点。(1)左子树是否平衡 (2)右子树是否平衡 (3)左子树的高度和右子树的高度差值低于1递归的套路package class_04;public class Code_06_IsBalancedTree { public static class...原创 2019-01-15 23:28:33 · 107 阅读 · 0 评论 -
二叉树的序列化和反序列化
思路:如何序列化,就如何反序列化。每个节点值后面用 ‘!’表示结束,‘#’表示空。如下按先序遍历,序列化为:1!2!4!#!#!5!#!#!3!6!#!#!7!#!#!,注意空节点,要添加进来package class_04;import java.util.LinkedList;import java.util.Queue;public class Code_04_Seria...原创 2019-01-15 22:23:50 · 125 阅读 · 0 评论 -
归并排序
牛客网——左神package 左神_算法;import java.util.Arrays;public class MergeSort { /** * master公式的使用 T(N) = a*T(N/b) + O(N^d)1) log(b,a) > d -> 复杂度为O(N^log(b,a))2) * log(b,a) = d -> 复杂度为O(N^d...原创 2018-12-31 16:32:38 · 85 阅读 · 0 评论 -
快速排序
(1).经典快排的思路:首先选中数组最后一个元素x,<= x 的放数组左边,> x 的放数组右边,中间是 x。左边和右边(注意x,这一个元素已经排好,不需要操作了)无限递归继续上述操作,直至整体有序。如下图:(2).参照荷兰国旗问题的改进快排:首先选中数组最后一个元素x,< x 的放数组左边,> x 的放数组右边,== x 的全部放中间。左边和右边(中间的一个或多个...原创 2019-01-01 21:31:47 · 154 阅读 · 0 评论 -
堆排序
堆:就是完全二叉树,注意与满二叉树的区别,完全二叉树,从左往右依次有节点,节点缺一不可用数组表示完全二叉树,下标对应的关系,父:(i+1)/2,左孩子 2*i+1,右孩子 2*i+2。大根堆:这棵树的任何子树的结点,都是父节点大。小根堆:这棵树的任何子树的结点,都是父节点小。package 左神_算法;import java.util.Arrays;public cl...原创 2019-01-01 23:42:58 · 98 阅读 · 0 评论 -
桶排序
首先讨论的问题:给定一个数组,求如果排序后,相邻两数的最大值,要求时间复杂度 O(n)?桶:数组长度N,设计一个桶,数量为(N+1)个桶,数组最小值放进第一个桶,数组最大值放进最后一个桶,每一个桶都要包含min,max,这两个边界值。所以中间一定存在一个空桶,那么就可以得到一个结论:桶内之间绝对不会存在最大差值,最大差值就一定在桶与桶的边界值之间。从第二个桶开始遍历,用这个桶的min减去前一个...原创 2019-01-02 23:42:34 · 98 阅读 · 0 评论 -
布隆过滤器
文章参照和引用处:http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html首先布隆过滤器解决的问题是:在一个非常大的数据集合里面判断一个数据是否存在。常规的办法,可以使用一个hash哈希函数,但是非常消耗空间。我们不禁想到如何节省空间,这个时候布隆过滤器就出现了。我们可以在bit位上做文章。例如左神列举的例子:100亿个...原创 2019-01-17 22:12:00 · 144 阅读 · 0 评论 -
hash一致性
参照:https://www.cnblogs.com/moonandstar08/p/5405991.html参照:http://www.cnblogs.com/haippy/archive/2011/12/10/2282943.html以下内容,仅供自己理解复习,表达能力有限,还请您见谅!hash一致性解决的问题:如经典的服务器负载均衡,在前端通过一个相同的hash函数计算出一个数值...原创 2019-01-18 20:37:27 · 235 阅读 · 0 评论 -
并查集
并查集在ACM比赛之中比较的常见,映象较深的是PAT团体天梯赛中,中等的题目里面必有这样一道题目,基本的模板和套路。今日份通过左神算法学习,复习一下!深入理解请到:https://blog.csdn.net/dm_vincent/article/details/7655764参照:https://blog.csdn.net/dm_vincent/article/details/7769...原创 2019-01-18 22:17:56 · 121 阅读 · 0 评论 -
矩阵“回”,“之”,翻转打印
1. ‘回’字型打印 思路:从最外回字往里面一层层打印。如: 代码如下:package class_03;public class Code_06_PrintMatrixSpiralOrder { public static void spiralOrd...原创 2019-01-08 22:00:47 · 179 阅读 · 0 评论 -
二叉树,先-中-后,遍历
建议大家在小本本上,模拟一下,遍历路径,才能更好的理解代码代码如下:package class_04;import java.util.Stack;public class Code_01_PreInPosTraversal { public static class Node { public int value; public Node left; publi...原创 2019-01-14 23:29:41 · 126 阅读 · 0 评论 -
如何找二叉树的后继结点
二叉树的后继结点的定义:为该二叉树的中序遍历后,该节点后面一个结点即使该节点的后继结点。如图:中序遍历的结果是,4251637,所以 4的后继结点是2 ,2的后继结点是5package class_04;public class Code_03_SuccessorNode { public static class Node { public int value; p...原创 2019-01-14 23:41:00 · 488 阅读 · 0 评论