![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
早点睡 别熬夜
这个作者很懒,什么都没留下…
展开
-
对数器,比较器,矩阵打印问题解析
1:对数器的使用 点击链接2:认识java中的比较器的使用 点击链接3:猫狗队列 【题目】 宠物、狗和猫的类如下: public class Pet { private String type; public Pet(String type) { this.type = type; } public String getPetType() { return this.type...原创 2019-03-02 15:49:30 · 176 阅读 · 0 评论 -
二叉树7:已知一棵完全二叉树,求其节点的个数
要求:时间复杂度低于O(N),N为这棵树的节点个数思想:如果采用遍历的话,那么复杂度就刚好是O(n)。不符合要求;首先我们可以知道对于一个完全二叉树来说,具有n个节点的完全二叉树的深度是(log以2为底n)+1,所有我们可以先得到这棵二叉树的深度,即一共有多少层。然后判断这棵二叉树的右子树是否也到达了这个深度,如果到了,那么这棵二叉树的左子树一定是一棵满二叉树。再依次使用递归判断右子树。如果右...原创 2019-03-14 22:17:19 · 934 阅读 · 0 评论 -
二叉树2:在二叉树中找到一个节点的后继节点
【题目】 现在有一种新的二叉树节点类型如下: public class Node { public int value; public Node left; public Node right; public Node parent; public Node(int data) { this.value = data; } }该结构比普通二叉树节点结构多了一个指向父节点的parent指针。假 设...原创 2019-03-12 19:31:53 · 239 阅读 · 0 评论 -
二叉树3:介绍二叉树的序列化和反序列化
二叉树的序列化:所谓序列化也就是持久化,把二叉树变成一个字符串来存放在一个文件里面。二叉树的序列化也诶有很多方式。一般都是使用先序序列化的方式,先介绍二叉树先序序列化的方式,假设序列化的结果字符串为str,初始时str等于空字符串。先序遍历二叉树,如果遇到空节点,就在str的末尾加上“#!”,“#”表示这个节点为空,节点值不存在,当然你也可以用其他的特殊字符,“!”表示一个值的结束。如果遇到不为...原创 2019-03-12 20:55:07 · 107 阅读 · 0 评论 -
贪心1:金条问题
题目: 一块金条切成两半,是需要花费和长度数值一样的铜板的。比如 长度为20的 金条,不管切成长度多大的两半,都要花费20个铜 板。一群人想整分整块金 条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人,整块金条长度为 10+20+30=60. 金条要分成10,20,30三个部分。 如果, 先把长 度60的金条分成10和50,花费60 再把长度50的金条分成20和30, 花费...原创 2019-04-03 21:23:25 · 234 阅读 · 0 评论 -
哈希3:认识并查集
并查集: 并查集主要有两个作用。1:它可以查询两个元素A和B是不是同一个集合里面的。2:它可以把A和B两个元素所在的集合合并起来,注意是两个元素所在的集合,而不是两个元素。使用并查集的时候要一次性把数据全部输入,不支持动态的变化。下面来说一下实现并查集的结构:使用这样一种方式,假设每一个元素都是自己的代表节点,用代表节点表示集合。合并时:那个集合的元素更少,就挂在元素多的那个集合下面查...原创 2019-03-26 16:57:42 · 270 阅读 · 0 评论 -
哈希4:使用并查集解决岛问题
岛问题一个矩阵中只有0和1两种值,每个位置都可以和自己的上、下、左、右 四个位置相连,如果有一片1连在一起,这个部分叫做一个岛,求一个 矩阵中有多少个岛?举例:这个矩阵中有三个岛。思想:1:使用递归DFS,深度搜索;2:使用并查集;这里主要说一下使用并查集的方法。假设把那个大的岛分成两个岛,这样子分两个的时候有4个岛,那么我们可以怎么算出岛的个数呢** 我们只需要看这两个岛的边...原创 2019-03-26 20:18:16 · 329 阅读 · 0 评论 -
哈希1:认识哈希函数和哈希表;设计RandomPool结构
Hash函数特点:1.输入域无穷,输出域有限。例如:有无穷多个(在工程中可以具体到多少个,例如1000)输入参数经过hash函数映射后得到有限的输出域{1,2,3,4}。2.输入参数确定,经过hash函数映射出的返回值一样。(不是随机函数,不同的输入参数可能得到相同的返回值)。3.输入域上的值经过函数值映射后会几乎均等的分布在输出域上。 得到的输出值%m,也会均匀分布在0–m上。具体了解...原创 2019-03-24 11:40:49 · 203 阅读 · 0 评论 -
哈希2:认识布隆过滤器,一致性哈希
**布隆过滤器:**当我们要解决处理海量数据的时候,我们可以使用布隆过滤器。它其实也是一个集合。但是它有失误率。例子:当我们处理黑名单的时候,比如有100亿个黑名单,每一个就是一个链接,每个url是64个字节,当用户访问的时候我要判断是不是属于这个黑名单。显然我们可以想到用哈希表来处理,但是当我们用哈希表来解决的需要多大的空间呢,6400亿个字节也就是640G,太大了。这个时候我们就可以使用...原创 2019-03-24 16:52:09 · 188 阅读 · 0 评论 -
二叉树6:判断一棵树是否是完全二叉树
**完全二叉树:**所谓完全二叉树是指除了最后一层之外,其他每一层的结点数目都是满的,如果最后一层也满了就是满二叉树,如果最后一层不满那么结点全部集中在左侧,从左侧开始补齐。满二叉树是一棵特殊的完全二叉树,对于完全二叉树这种特殊的结构,它可以使用数组来表示各个结点,此时每个结点与它的子节点的位置下标之间存在直接的对应关系,即从数组中i=1开始存放元素,于是对于某个结点i,它的左孩子下标是2i,它的...原创 2019-03-14 21:34:57 · 495 阅读 · 0 评论 -
二叉树5:判断一棵树是否是搜索二叉树
**搜索二叉树(BST):**所谓搜索二叉树,即左子树上的所有节点都比根节点的小,注意是所有;右子树上的所有节点都比根节点的大。所有搜索二叉树有一个特点,如果采用的是中序遍历的方法遍历这棵二叉树的话,那么这个序列一定是单调递增的。思想:怎么判断是否是一棵搜索二叉树呢,我们可以通过中序遍历这棵二叉树的方法,如果这个序列是单调递增的那么这棵树一定是搜索二叉树。使用中序遍历的非递归方法可以很简单的就...原创 2019-03-14 20:35:16 · 355 阅读 · 0 评论 -
栈变队列,队列变栈,猫狗队列
栈:先进后出; 队列:先进先出;栈变队列:用两个栈结构实现队列结构。思想:定义一个stackPush栈用来存放添加进来的元素,定义一个stackPop栈用来返回队列的poll方法。一开始将添加的元素放入到Push栈里面,然后如果要调用队列的poll方法时,使用while循环将Push栈里面的元素全部放入到Pop栈里面,再返回Pop栈的pop方法。代码:public static cla...原创 2019-02-28 20:56:43 · 220 阅读 · 0 评论 -
算法之桶排序,数组结构实现大小固定的队列和栈
桶排序:把数据放入一个个定义范围的桶中,定义的范围必须完全一样。每个桶再排序。经典例题:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排序。思想如上图所示。用数组结构实现大小固定的队列和栈思想:先定义一个数组的大小即栈的长度,再定义一个变量来表示当前栈顶元素的位置代码如下:变队列:用3个变量,一个size定义队列的长度,一个first...原创 2019-02-28 19:48:33 · 193 阅读 · 0 评论 -
链表4:复制含有随机指针节点的链表
【题目】 一种特殊的链表节点类描述如下: public class Node { public int value; public Node next; public Node rand; public Node(int data) { this.value = data; } } Node类中的value是节点值,next指针和正常单链表中next指针的意义 一 样,都指向下一个节点,rand指...原创 2019-03-06 19:56:27 · 94 阅读 · 0 评论 -
二叉树1:实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式
二叉树的先序遍历:3种遍历理解原创 2019-03-09 16:11:06 · 3930 阅读 · 0 评论 -
链表1:反转单向链表,双向链表
反转单向链表 思想:有好几种方法:这里采用的是创建一个新的链表来存放新产生的链表,把原链表的表头节点依次接到新的链表中代码:public static class Node { //定义一个Node节点类 public int value; public Node next; public Node(int data) { this.value = data; ...原创 2019-03-04 16:29:14 · 185 阅读 · 0 评论 -
链表2:判断一个链表是否为回文结构
【题目】 给定一个链表的头节点head,请判断该链表是否为回 文结构。 例如: 1->2->1,返回true。 1->2->2->1,返回true。 15->6->15,返回true。 1->2->3,返回false。进阶: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂 度达到O(1)。思想:这里介原创 2019-03-04 17:02:47 · 117 阅读 · 0 评论 -
链表3: 两个单链表相交的一系列问题
【题目】 在本题中,单链表可能有环,也可能无环。给定两个 单链表的头节点 head1和head2,这两个链表可能相交,也可能 不相交。请实现一个函数, 如果两个链表相交,请返回相交的 第一个节点;如果不相交,返回null 即可。 要求:如果链表1 的长度为N,链表2的长度为M,时间复杂度请达到 O(N+M),额外 空间复杂度请达到O(1)。思想:1,用哈希表遍历,如果遍历到相同的则表示有环,因...原创 2019-03-04 20:22:58 · 147 阅读 · 0 评论 -
二叉树4:判断一棵二叉树是否是平衡二叉树
平衡二叉树,又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。 思想:即每个节点...原创 2019-03-14 18:52:53 · 380 阅读 · 0 评论 -
字符串1:前缀树的使用
前缀树: Trie树,又称字典树、前缀树,是一种树形结构,是哈希树的变种,是一种用于快速检索的多叉树结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。Trie树也有它的缺点,Trie...原创 2019-03-27 21:08:09 · 369 阅读 · 0 评论