
数据结构
余晖消逝之前都不算终点
这个作者很懒,什么都没留下…
展开
-
排序
一 冒泡排序 遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止。public class BubbleSort { public static void main(...原创 2019-03-18 18:10:32 · 213 阅读 · 0 评论 -
桶排序,计数排序,基数排序
1.非基于比较的排序,与被排序的样本的实际数据状况很有关系,所以实际中并不经常使用2.时间复杂度O(N),额外空间复杂度O(N)3.稳定的排序题目一:给定一个数组,如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序分析:借用了桶的概念,但没有进行桶排序。步骤:如果一个数组中有N个数,就准备N+1个桶(0,1,2,...N),每个桶只记录单独一...原创 2019-04-02 18:56:43 · 361 阅读 · 2 评论 -
哈希函数和哈希表
哈希函数:1.经典的哈希函数接受的输入域是无穷的,而输出域相对来说是有限的。比如MD5会返回一个哈希码它是16进制的,是2^64次方的范围;SHA-1会返回2^128的范围。不管什么范围,返回域是有限的。2.哈希函数不是随机函数,相同的输入值一定得到相同的返回值。3.由于哈希函数接受的输入域是无穷的,而输出域相对来说是有限的,可能会导致不同的输入也可能对应一个输出。把这种情况称为哈希碰...原创 2019-04-08 17:08:34 · 274 阅读 · 0 评论 -
反转单向和双向链表
分别实现反转单向链表和反转双向链表的函数要求:如果链表长度为N,时间复杂度要求为O(N),额外空间复杂度要求为O(1)原创 2019-04-11 21:29:03 · 274 阅读 · 1 评论 -
布隆过滤器
布隆过滤器:常见的爬虫项目或者黑名单项目常见的一个结构。为了查某个东西是否存在一个集合里。已经有哈希表为什么要用布隆过滤器呢??布隆过滤器就是一个集合的概念,布隆过滤器要解决的问题是,比如说有一个黑名单,是一个大文件,(可能是一个分布式文件),这个文件里面有100亿个url,每个url是64字节。如果要用一个哈希表把所有的url装起来,那就需要6400亿Byte也就是640G的空间,如果想要实...原创 2019-04-12 08:57:46 · 389 阅读 · 0 评论 -
转圈打印矩阵
题目:给定一个整形矩阵matrix,请按照转圈的方式打印它。例如:1 2 3 45 6 7 89 10 11 1213 14 15 16打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10要求:额外空间复杂度为O(1).分析:如果把思路限制在局部坐标怎么变换上面,这个题就很难写...原创 2019-04-08 19:22:41 · 181 阅读 · 0 评论 -
打印两个有序链表的公共部分
题目:给定两个有序链表的头指针head1和head2,打印两个链表的公共部分分析:类似于外排比如:一个链表1->3->5->6->10另一个链表2->3->6->7一开始,一个指针指向1,一个指针指向2,谁小动谁。1小,所以第一个指针来到3的位置,然后3和2比,2小,第二个指针来到3的位置,相等的时候打印。然后两个指针共同往下挪一步。逻辑就...原创 2019-04-08 20:26:40 · 214 阅读 · 0 评论 -
判断一个链表是否为回文结构
题目:给定一个链表的头节点head,请判断该链表是否为回文结构(正反一样)。例如:1->2->1,返回true。1->2->2->1,返回true。15->6->15,返回true。1->2->3,返回false。进阶:如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)分析:基本解法:如果有一个链表1-...原创 2019-04-08 20:59:41 · 376 阅读 · 0 评论 -
将单向链表按某值划分成左边小,中间相等,右边大的形式
【题目】 给定一个单向链表的头节点head,节点的值类型是整型,再给定一个整数pivot。实现一个调整链表的函数,将链表调整为左部分都是值小于 pivot的节点,中间部分都是值等于pivot的节点,右部分都是值大于pivot的节点。除这个要求外,对调整后的节点顺序没有更多的要求。 例如:链表9->0->4->5->1,pivot=3。 调整后链表可以是1->0->...原创 2019-04-08 21:21:32 · 535 阅读 · 0 评论 -
一致性哈希
先介绍一个经典的服务器结构,有一个前端,前端服务器组可能就是专门用来分发用的,比如一个请求,举一个具体的例子,比如一个request,查一个姓名叫“zuo”的告诉年龄age是多少。这个往服务器上存的时候实际上推的是这么一个对儿,{“zuo”,31},也可以更新它,也可以拿出,“zuo”作为key,31作为value。一个经典的结构包括一个更复杂的request也是这样的:请求先到达前端服务...原创 2019-06-20 22:13:18 · 179 阅读 · 0 评论 -
剑指offer--随时找到数据流的中位数
有一个远远不断的吐出整数的数据流,假设你有足够的空间来保存吐出的数,请设计一个名叫MedianHolder的结构,MedianHolder可以随时去的之前吐出所有数的中位数。要求:1.如果MedianHolder已经保存了吐出的N个数,那么任意时刻将一个新数加入到MedianHolder的过程,其时间复杂度为O(logN)。2.取得已经吐出的N个数整体的中位数的过程,时间复杂度为O(1)。...原创 2019-06-21 15:15:07 · 362 阅读 · 0 评论 -
一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的金条,不管切成长度多大的两半,都要花费20个铜板。一群人想整分整块金条,怎么分最省铜板。
例如,给定数组{10,20,30},代表一共三个人,整块金条长度为10+20+30=60。金条要分成10,20,30三个部分。如果,先把长度60的金条分成10和50,花费60。再把长度50的金条分成20和30,花费50。一共花费110铜板。但是如果,先把长度60的金条分成30和30,花费60,再把长度30金条分成10和20,花费30。一共花费90铜板。输入一个数组,返回分割的最小代价。...原创 2019-06-21 15:41:32 · 1065 阅读 · 0 评论 -
你最后获得的最大钱数
输入: 参数1,正数数组costs参数2,正数数组profits参数3,正数k参数4,正数mcosts[i]表示i号项目的花费; profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润) ;k表示你不能并行、只能串行的最多做k个项目; m表示你初始的资金说明:你每做完一个项目,马上获得的收益,可以支持你去做下一个项目。输出: 你最后获得的最大钱数思路:这个题是个标准...原创 2019-06-21 16:17:32 · 311 阅读 · 0 评论 -
递归和动态规划
暴力递归:1,把问题转化为了规模缩小了的同类问题的子问题2,有明确的不需要继续进行递归的条件(base case)3,有当得到了子问题的结果之后的决策过程4,不记录每一个子问题的解例如:public static int getMin(int[] arr, int L, int R){ if(L == R){ return arr[L]; ...原创 2019-08-10 10:44:36 · 174 阅读 · 0 评论 -
猫狗队列问题
猫狗队列 【题目】 宠物、狗和猫的类如下:public class Pet { private String type;public Pet(String type) { this.type = type; }public String getPetType() { return this.type; }}public class Dog extends Pet { public Dog...原创 2019-04-08 15:43:37 · 211 阅读 · 0 评论 -
排序的稳定性
排序稳定性:相同的值会不会因为某个排序算法,相对次序被打乱。如果不会被打乱,这个排序算法就具有稳定性;如果会被打乱,这个排序算法就不具有稳定性。冒泡排序:可以实现成稳定的排序算法(O(N^2))插入排序:可以实现成稳定的排序算法(O(N^2))选择排序:在一开始的元素中选一个最小的和第0号元素交换,无论怎么实现都做不到稳定排序。(O(N^2))归并排序:可以做到稳定排序。(O(Nl...原创 2019-04-02 15:59:35 · 319 阅读 · 0 评论 -
判断一棵树是否是平衡二叉树
平衡二叉树定义:对于一棵树中任一节点,它的左子树和右子树的高度差不超过1(满二叉树一定是平衡二叉树,但平衡二叉树不一定是满二叉树)套路:递归函数很好用,它不仅仅用来写先序中序后序,它还能解决很多问题,抛开先序后序中序这些个顺序来看,递归来到每个节点的顺序,它会回到每个节点三次,也就是说,我既然可以回到一个节点三次,我就可以想办法收集一下左子树上的信息,收集一下右子树的信息,然后把这些信息做整合...原创 2019-03-29 15:20:12 · 743 阅读 · 0 评论 -
判断一棵树是否是搜索二叉树,判断一棵树是否是完全二叉树
一 搜索二叉树:对于这棵树上任何一个节点为头的子树,左子树都比它小,右子树都比它大二 完全二叉树:判断逻辑是:二叉树按层遍历。1.如果一个节点P它有右孩子,但是没有左孩子,一定不是完全二叉树(return false)2.如果一个节点不是左右两个孩子都全: 有左没右,或者左右都没,出现这种情况时,它后面遇见的所有节点都必须是叶节点。否则不是完全二叉树。完全二叉树和节点的值是没有关系...原创 2019-03-29 15:52:48 · 366 阅读 · 0 评论 -
已知一棵完全二叉树求其节点的个数
题目:已知一棵完全二叉树,求其节点的个数要求:时间复杂度低于O(N),N为这棵树的节点个数。分析:如果一棵树是满二叉树,高度为L,则它的节点个数是2^L-1个。首先,遍历整棵树的左边界,因为已经告诉你这是一棵完全二叉树,你遍历它的左边界就能求出这棵树的高度,因为完全二叉树一定是从每一次的左边往右开始怼起的,怼满之后怼下一层。所以整棵树先遍历它的左边界,代价是O(logN)。然后遍历整棵...原创 2019-03-29 16:50:28 · 1399 阅读 · 0 评论 -
用数组结构实现大小固定的队列和栈
题目:用数组结构实现大小固定的队列和栈分析:如果强行限制给出一个长度为n的数组,设计一个大小为n的栈,如果超过这个大小,可以报错。栈:先进后出队列:先进先出public class Array_To_Stack_Queue { public static class ArrayStack { private Integer[] arr; private Intege...原创 2019-04-03 21:45:57 · 285 阅读 · 0 评论 -
返回栈中最小元素
题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作要求:1 pop,push,getMin操作的时间复杂度都是O(1)2 设计的栈类型可以使用现成的栈结构分析:准备两个栈,第一个栈是data栈,用来保存当前栈中的元素;第二个栈是min栈,用来保存每一步的最小值。第一个思路是:假设当前数据是newNum,先将其压入data栈,然后判...原创 2019-04-03 21:47:22 · 429 阅读 · 0 评论 -
仅用队列结构实现栈结构&仅用栈结构实现队列结构
题目四:如何仅用队列结构实现栈结构?如何仅用栈结构实现队列结构?import java.util.LinkedList;import java.util.Queue;import java.util.Stack; public class StackAndQueueConvert { public static class TwoStacksQueue { private ...原创 2019-04-03 21:49:31 · 240 阅读 · 0 评论 -
堆排序
堆:完全二叉树结构。满二叉树是完全二叉树,如果不是满二叉树,每一层是从左往右依次补齐的,这样的是完全二叉树。堆实际上是可以用数组来实现的,可以把一个数组理解为一棵完全二叉树,数组与二叉树的位置对应关系是:下标位置为i的元素,在不越界的情况下,它的左孩子下标为2*i+1,它的右孩子下标为2*i+2;它的父节点(i-1)/2;当一个数组的元素下标有这样的位置对应关系,就可以脑补出一棵完全二叉树,换...原创 2019-03-30 18:10:36 · 219 阅读 · 0 评论 -
复制含有随机指针节点的链表
一种特殊的链表节点类描述如下:(一个单链表的节点加了一条指针,加了一个rand指针。这个rand指针是随机指向某个节点的)public class Node{ public int value; public Node next; public Node rand; public Node(int data){ this.value = da...原创 2019-04-10 21:23:03 · 265 阅读 · 0 评论 -
两个单链表相交的一系列问题
【题目】 在本题中,单链表可能有环,也可能无环。给定两个单链表的头节点 head1和head2,这两个链表可能相交,也可能不相交。请实现一个函数, 如果两个链表相交,请返回相交的第一个节点;如果不相交,返回null 即可。 要求:如果链表1的长度为N,链表2的长度为M,时间复杂度请达到 O(N+M),额外空间复杂度请达到O(1)。分析:要想求解这个问题先要解决一个基本问题,怎么判断一个链表...原创 2019-04-10 22:18:38 · 220 阅读 · 0 评论 -
二叉树先序,中序和后序遍历(递归和非递归方式)
package com.tree;import java.util.Stack;//二叉树的先序,中序,后序遍历,包括递归方式和非递归方式public class PreInPosTraversal { public static class Node { public int value; public Node left; public Node righ...原创 2019-03-28 20:16:49 · 332 阅读 · 0 评论 -
如何直观的打印一棵二叉树
这个函数可以将你的二叉树非常直观以一棵树的样子打印出来,不过打印出来的结果需要将头旋转逆时针90度来看package com.tree;public class PrintBinaryTree { public static class Node { public int value; public Node left; public Node right; pub...原创 2019-03-28 20:32:32 · 575 阅读 · 0 评论 -
找二叉树中一个节点的后继节点,前驱节点
后继节点:后继节点是二叉树中序遍历后的集合每个节点的下一个节点前驱节点:二叉树中序遍历后的集合每个节点的前一个节点问:给定某个节点,怎么找到他的后继节点? 如何避免遍历整棵树生成整个序列,能不能通过这个节点与它后继节点的距离,来找到某个节点的后继节点?规律是这样的:假定某个节点X,情况一:如果X有右子树,则节点X的后继节点一定是它的右子树的最左的节点。(因为中序遍...原创 2019-03-28 21:04:46 · 664 阅读 · 0 评论 -
二叉树的序列化和反序列化
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如按照先序遍历和层序遍历进行序列化和反序列化代码如下:package com.tree;import java.util.LinkedList;import java.uti...原创 2019-03-28 21:28:22 · 190 阅读 · 0 评论 -
最小路径和问题
给你一个二维数组,二维数组中的每个数都是正数,要求从左上角走到右下角,每一步只能向右或者向下。沿途经过的数字要累加起来。返回最小的路径和。这道题可以帮助理解暴力递归不好在哪里,动态规划是怎么改正的。先用暴力递归写代码:public class Main { public static void main(String[] args) { //int[][] array = {...原创 2019-08-10 12:12:16 · 354 阅读 · 0 评论