
数据结构与算法入门
winrar_setup.rar
对,我懒
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
二叉树的序列化和反序列化
序列化将二叉树的各个节点的值和位置以文本的形式存储下来。其中叶子节点的left和right都是null,制定一个特殊字符代替null即可。反序列化根据序列化的规则,将文本转化为一棵二叉树。先序遍历顺序序列化二叉树每个节点的值之间用#间隔,遇到空节点用@代替。 public static String SerializeByPre(Node head){ ...原创 2020-04-10 11:34:22 · 437 阅读 · 0 评论 -
二叉树的先序、中序和后序遍历(递归与非递归方式)
目录二叉树的基本结构什么是序二叉树遍历的递归版本递归先序(中 -> 左 -> 右)递归中序(左 -> 中 -> 右)递归后序(右 -> 左 ->中)二叉树遍历的非递归版本非递归先序非递归中序(精华)非递归后序二叉树的基本结构class Node{ int data; Node left; Node righ...原创 2020-04-05 22:25:44 · 1327 阅读 · 0 评论 -
岛问题
题目一个矩阵中只有0和1两种值,每个位置都可以和自己的上、下、左、右 四个位置相连,如果有一片1连在一起,这个部分叫做一个岛,求一个矩阵中有多少个岛?解题思路矩阵在代码中的表现形式就是二维数组。从头开始遍二维数组,遇到值为1的点,岛的数量加一;同时将该点以及该点上下左右值为1的点的值都改为2并且依次传染下去,这样该点所在的相邻为1的区域的1就都变为了2,感染动作结束,继续遍历。直...原创 2020-04-04 21:11:11 · 672 阅读 · 0 评论 -
并查集
什么是并查集 是一种自定义的数据结构.可以快速完成两个任务 1-查看两个元素是否属于同一个集合 2-给定两个元素,将两个元素所属的集合合并为一个大集合有多快 在样本量为N的时候,所有合并和确认是否为同一个集合的操作次数接近N次时,其每一次操作的平均时间复杂度为O(1)如何工作 在并查集结构中,以链表的形式来表现"集合",如果Nod...原创 2020-04-04 13:11:57 · 355 阅读 · 0 评论 -
TrieTree 前缀树
前缀树:理论知识不做赘述,直接看代码1-Node节点、树是由一个个节点组件而来,那前缀树的节点应该包含哪些基本信息呢: a-以当前节点作为末尾节点的次数 b-以当前节点作为中间节点的次数 c-当前节点的后续节点代码如下: class TrieNode{ int path; int end; TrieNode [] nexts ; Tri...原创 2020-04-01 12:29:32 · 340 阅读 · 0 评论 -
最小字典序组合
题目给定一个字符串类型的数组strs,找到一种拼接方式,使得把所有字符串拼起来之后形成的字符串具有最低的字典序.解题思路如果只有两个字符,那么我们期望的排序是当str1 + str2的拼接结果小于str2 + str1的拼接结果时,得到str1 + str2.也就是说希望String数组中每两个字符串之间的排序规则都按照(str1 + str2).comparaTo(str2 + st...原创 2020-03-31 11:05:47 · 591 阅读 · 0 评论 -
IPO问题
题目及要求如下输入:参数1,正数数组costs 参数2,正数数组profits 参数3,正数k 参数4,正数mcosts[i]表示i号项目的花费,profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润),k表示不能并行、只能串行的最多做k个项目,m表示初始的资金说明:每做完一个项目,马上获得的收益,可以支持你去做下一个项目。输出:最后获得的最大钱数。主体思路 每次...原创 2020-03-30 11:29:07 · 338 阅读 · 0 评论 -
会议宣讲调度问题
题目:一些项目要占用一个会议室宣讲, 会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间(给你一个数组, 里面 是一个个具体的项目), 你来安排宣讲的日程, 要求会议室进行 的宣讲的场次最多。 返回这个最多的宣讲场次。解题思路:如果想要宣讲最多次数,可以按照会议的结束时间作为优先比较的项.结束时间靠前的先宣讲,宣讲完毕后,去掉开始时间大于上一次会议结束时间的...原创 2020-03-27 11:54:43 · 347 阅读 · 0 评论 -
哈夫曼编码问题
经典的哈夫曼编码问题:一块金条切成两半, 是需要花费和长度数值一样的铜板的。 比如长度为20的 金条, 不管切成长度多大的两半, 都要花费20个铜板。 一群人想整分整块金 条, 怎么分最省铜板?例如,给定数组{10,20,30}, 代表一共三个人, 整块金条长度为10+20+30=60. 金条要分成10,20,30三个部分。如果, 先把长度60的金条分成10和50, 花费60 再把长度...原创 2020-03-26 13:48:57 · 1208 阅读 · 0 评论 -
布隆过滤器(BloomFilter)
布隆过滤器的用途让我们先来看一个业务场景.假设某搜索公司的URL黑名单有100亿条记录.业务上需要时刻监控如果用户访问的URL是黑名单中的就驳回访问请求.如何实现这样的黑名单监控功能呢?最容易的办法当然是将数据存入hash表中,用户访问网页时,查看黑名单hash表中是否包含其正访问的网址以做出正确的回应.伪代码可以简单的写成if(userUrl == blackList.get(...原创 2020-03-19 22:00:28 · 345 阅读 · 0 评论 -
已知一个完全二叉树,求其节点个数
解题思路:根据完全二叉树的定义可以知道,如果一个节点的右子树生长到了整棵树的最顶端,那么这棵树的左子树一定是一棵满二叉树.如果右子树没有生长到最顶端,那右子树一定是一棵满二叉树,只不过高度 - 1满二叉树的节点计算公式为 nodeNumber = (2 ^ level ) -1 public static int getNodeNum(Node head){ if(hea...原创 2020-03-18 18:03:15 · 906 阅读 · 0 评论 -
如何判断一棵树是不是完全二叉树
完全二叉树子节点从左往右生长,一层生长完全才可以生长下一层.解题思路: 横向遍历(按层)二叉树的过程中,每个节点的子节点有以下四种情况: 1-左右都没有 : 该节点为叶子节点 2-左右都有: 没啥说的,一个没什么幺蛾子的节点. 3-有右没左 : 出现这种情况直接返回false,这种情况违反完全二叉树的定义 ...原创 2020-03-18 15:49:03 · 959 阅读 · 1 评论 -
判断一棵树是不是搜索树
搜索二叉树一棵树上任何一个节点,左子树的值都比节点本身值小,右节点都比节点本身值大.二叉树的中序遍历节点值是依次升序的就是搜索二叉树.通常搜索二叉树中不会出现重复节点.利用递归函数会访问每个节点三次的特性,先收集左树信息再收集右树信息,然后比较是否符合规定.1-设计返回结构返回结构需要包含当前节点是否符合左节点比自己小右节点比自己大的信息,还要包含当前节点的值.结构如下:...原创 2020-03-18 14:03:07 · 309 阅读 · 0 评论 -
如何判断一棵树是不是平衡二叉树
平衡二叉树对于任意一个节点,左子树和右子树的高度差不超过1.满二叉树一定是平衡二叉树.解题思路:在树类问题上,递归函数使用起来很方便.它可以让我们从一个节点上经过三次.利用这个特性可以解决大多数的问题.我们可以先收集左树信息,再收集右数信息然后返回到当前节点判断该节点是否满足要求.在本题中,我们需要收集的信息是:左树是否平衡,右树是否平衡以及左树和右树的高度.1-可能性分析...原创 2020-03-18 11:25:05 · 765 阅读 · 0 评论 -
二叉树的序列化和反序列化
题目其实就是将二叉树转化成字符串同时保留树的空间信息.可以用空占位符占住空节点的位置,用来描述树的实际结构.先序遍历的方式序列化代码如下: public static String serialByPre(Node head){ if(head == null){ return "#_"; } String res = head.data + "_"; res +=...原创 2020-03-17 18:25:32 · 195 阅读 · 0 评论 -
在二叉树中找到一个节点的后继节点
【 题目】 现在有一种新的二叉树节点类型如下:public class Node { public int value; public Node left; public Node right; public Node parent; public Node(int data) { this.value = data; }}该结构比普通二叉树节点结构多了一...原创 2020-03-17 16:59:56 · 734 阅读 · 0 评论 -
寻找两个链表的相交节点
单链表可能有环,也可能无环.给定两个单链表的头节点head1和head2,这两个链表可能相交,也可能不相交.请实现一个函数,如果两个链表相交,请返回相交的第一个节点;如果不相交,返回null即可.要求 : 如果链表1的长度为N,链表2的长度为M,时间复杂度请达到 O(N+M),额外空间复杂度请达到O(1).解题思路:这个题可以分为三个题来做.求解此题也是三个步骤.1-判断是否有环....原创 2020-03-16 14:27:22 · 722 阅读 · 0 评论 -
复制含有随机指针节点的链表
【 题目】 一种特殊的链表节点类描述如下:public class Node { public int value; public Node next; public Node rand; public Node(int data) { this.value = data; }}Node类中的value是节点值, next指针和正常单链表中next指针的...原创 2020-03-13 16:54:49 · 248 阅读 · 0 评论 -
单向链表按值划分
【 题目】 给定一个单向链表的头节点head, 节点的值类型是整型, 再给定一个整 数pivot。 实现一个调整链表的函数, 将链表调整为左部分都是值小于 pivot的节点, 中间部分都是值等于pivot的节点, 右部分都是值大于 pivot的节点。除这个要求外, 对调整后的节点顺序没有更多的要求。 例如: 链表9->0->4->5->1, pivot=3。 调整后链表可以...原创 2020-03-13 15:24:45 · 522 阅读 · 0 评论 -
如何判断一个链表是否是回文结构
回文结构:把中间作为起点,往左和往右的内容相同.提供了三种解法:1-额外空间复杂度为O(n) : 创建一个stack,将list中的数据遍历存到stack中,然后判断stack.pop.data是否等于list.next.value.2-额外空间复杂度为O(n/2): 设置两个指针一个快一个慢,快指针一次走两步,慢指针一次走一步.当快指针不能往下走的时候,满指针到list中间....原创 2020-03-12 18:28:53 · 308 阅读 · 0 评论 -
打印两个有序链表的公共部分
【 题目】 给定两个有序链表的头指针head1和head2, 打印两个链表的公共部分。相等则打印出数据并且两个指针一起往下移动,不相等则小的那个往后移动(因为是排序的)public static void printEquals(Node n1 , Node n2) { boolean flag = true; while(n1 != null &&...原创 2020-03-11 18:01:33 · 238 阅读 · 0 评论 -
反转单向链表
解题思路:给链表的头部节点取个名字,叫head.单向链表是head.next指向后边的next Node,注意,next Node后边还有next Node,所以此时的next Node代表的是Node链.最后的Node.next指向null.a-如果要完成反转,可以先用一个变量next保存head后边的所有Node也就是head.next.b-然后在找一个null变量让head....原创 2020-03-11 15:36:53 · 211 阅读 · 0 评论 -
"之"字形打印矩阵
【题目】 给定一个矩阵matrix,按照“之”字形的方式打印这 个矩阵,例如:1 2 3 45 6 7 89 10 11 12 “之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11, 8,12【要求】 额外空间复杂度为O(1)。暴力解题思路:通过createPoint()函数,根据第一列的坐标值生成整个斜线的坐标值,然后通过flag决定是否反转.public c...原创 2020-03-11 00:42:12 · 287 阅读 · 0 评论 -
在行列都排好序的矩阵中找数
【 题目】 给定一个有N*M的整型矩阵matrix和一个整数K,matrix的每一行和每一 列都是排好序的。 实现一个函数, 判断K是否matrix中。 例如: 0 1 2 5 2 3 4 7 44 8 5 7 7 9 如果K为7, 返回true; 如果K为6, 返回false。【 要求】 时间复杂度为O(N+M), 额外空间复杂度为O(1)。思路:从右下方最大值的地方开始找,先横向移动...原创 2020-03-10 18:47:57 · 172 阅读 · 0 评论 -
转圈打印矩阵
【 题目】 给定一个整型矩阵matrix, 请按照转圈的方式打印它。例如:1 2 3 4 5 6 7 8 9 10 11 12 13 1415 16打印结果为: 1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9,5, 6, 7, 11, 10【 要求】 额外空间复杂度为O(1)。主要学习宏观变化代替微观变化需要注意,二维数组的第一维度表示Y坐标,第二...原创 2020-03-10 17:59:21 · 172 阅读 · 0 评论 -
猫狗队列
【 题目】 宠物、 狗和猫的类如下:class Pet { private String type; public Pet(String type) { this.type = type; } public String getPetType() { return this.type; }}class Dog ...原创 2020-03-10 17:59:27 · 269 阅读 · 0 评论 -
队列和栈的转化
1- 如何仅用队列结构实现栈结构?使用两个队列,一个data队列一个help队列.加入压栈五个数之后要弹出第五个数,两个队列的操作就是,压栈五个数正常存入data队列,弹栈的时候前四个数先进help队列,data队列中的数当做弹栈的数据返回,然后help和data队列互换引用.import java.util.LinkedList;import java.util.Queue;...原创 2020-03-10 17:59:32 · 317 阅读 · 0 评论 -
特殊栈(可以获取最小值)
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作.【要求】1.pop、push、getMin操作的时间复杂度都是O(1)。2.设计的栈类型可以使用现成的栈结构。解题思路:使用两个栈结构,一个data栈一个min栈.data栈就是正常的栈操作,min栈在新加入元素时,新元素同栈顶的元素比较,谁小存谁.比如数字[5,6,4,3,7]依次进行压栈操作...原创 2020-03-10 17:59:37 · 257 阅读 · 0 评论 -
用数组结构实现大小固定的队列和栈
用一个变量index表示下一次压栈应该压到哪里.class ArrayStack { private int [] stack ; private int index = 0; public ArrayStack(int size){ if (size < 0) { throw new IllegalArgument...原创 2020-03-10 17:59:42 · 239 阅读 · 0 评论 -
桶排序 -- 计数排序
桶排序是不基于比较的排序,是一个大的概念.其 实现 有计数排序和基数排序.桶排序受数据状况本身影响特别严重.计数排序如果知道一个待排序数组中的值是0~60,桶排序的步骤如下1-建立一个可以包含范围内所有数据的数组,即长度为61的数组arr2-遍历待排序数组,遍历得到的每个值都在新建的数组对应index上加一.比如第一个值是2,则新建数组arr[2] ++3-遍历结束后,...原创 2020-03-10 17:59:47 · 361 阅读 · 2 评论 -
排序算法的稳定性
参与排序的数组中会有一些相同的值.排序之后这些相同值的相对位置如果没有发生变化,则算法是稳定的.O(N^2)冒泡排序/插入排序可以实现出稳定的版本选择排序不稳定O(N log N)归并排序可以做到稳定性.快速排序不稳定.因为partition的过程不稳定. 快速排序可以做到稳定性,但非常难,可以搜索"01 stable sort"堆排序不能做到稳定性.算法...原创 2020-03-10 17:59:50 · 313 阅读 · 0 评论 -
堆排序
堆通常可以理解为树状的数据结构.每个堆都是一棵完全二叉树.在计算机中,堆可以用数组模拟出来.第0个元素作为堆的根,叶子节点的位置为 i * 2 + 1(左叶子) 和 i * 2 + 2(右叶子),i是根节点的index.我们通常把堆分为大根堆和小根堆.大根堆:每棵树以及树内包含的子树,根节点的数值都大于叶子节点的数值.小根堆则刚好相反,每棵树及树内包含的子树,根节点的数值都小于叶子节点...原创 2020-03-10 17:59:55 · 193 阅读 · 0 评论 -
快速排序(QuickSort)
经典快排快速排序是选定数组最后一个值作为标准值,小于等于该值的数移动到数组左侧,大于该值的数移动到数组右侧.递归执行以上步骤.public class QuickSort { /** * 快速排序是选定数组最后一个值作为标准值,小于等于该值的数移动到数组左侧,大于该值的数移动到数组右侧. * 递归执行以上步骤. */ public ...原创 2020-03-10 17:59:59 · 369 阅读 · 0 评论 -
荷兰国旗问题
给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)解题思路:将数组分文三个区域:小于,等于和大于,用两个变量来记录边界.最开始的时候还不知道哪些小哪些大,所以小于部分在-1位置开始,大于部分在arr.length开始.若找到了一个比target值小的数,...原创 2020-03-10 18:00:03 · 178 阅读 · 0 评论 -
逆序对问题(归并排序解法)
逆序对问题 在一个数组中,左边的数如果比右边的数大,则这两个数构成一个逆序对,请打印所有逆序对。解题思路同第一题完全相同,区别在于要找的是左边大的,也就是p[0] > p[1]时,打印两数组成的tuple.代码如下:public class ReversePairs { public static void reversePairs(int [] arr) { ...原创 2020-03-10 18:00:08 · 391 阅读 · 0 评论 -
小和问题(归并排序解法)
在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组 的小和。例子:[1,3,4,2,5] 1左边比1小的数,没有; 3左边比3小的数,1; 4左边比4小的数,1、3; 2左边比2小的数,1; 5左边比5小的数,1、3、4、2; 所以小和为1+1+3+1+1+3+4+2=16解题思路: 求一个数左边比它小的数的和,等于求这个数组中,当前数 * 当前数右边...原创 2020-03-10 17:35:22 · 712 阅读 · 0 评论 -
归并排序(merge sort)
一个数组分为两部分分别排序.左侧和右侧都有序之后,使用外排的形式再合并到一起,变成整体有序.public class MergeSort { public static void mergeSort(int [] arr){ if(arr == null && arr.length < 2) { return; } mergeSo...原创 2020-03-10 17:34:16 · 332 阅读 · 0 评论 -
插入排序(Insertion sort)
从数组第一个元素开始,跟前一个元素进行比较(第0个元素没有前一个元素,所以从第一个开始),如果该元素比前一个元素小,则交换,如果前边还有元素,继续比较交换,该数字比前一个数字大,则停止比较,继续到后一个数做同样的动作.public class InsertionSort { if (arr == null || arr.length < 2) { retur...原创 2020-03-10 17:33:05 · 177 阅读 · 0 评论 -
选择排序(Selection sort)
在数组中选择一个最小的,放入第一个位置(和第一个位置的交换),选择第二小的放入第二个位置.以此类推.public class SelectionSort { public static void selectionSort(int [] arr){ for (int i = arr.length -1 ; i > 0 ; i-- ) { ...原创 2020-03-10 18:00:13 · 323 阅读 · 0 评论 -
冒泡排序(Bubble Sort)
从第一个元素开始,让前一个元素和后一个元素进行比较,大的放后边.循环n次,每次选出数组中剩下部分最大的那个放后边.第一轮比较n次,第二轮比较n-1次.public class BubbleSort { public static void bubbleSort(int [] arr){ for (int i = arr.length -1; i > 0 ...原创 2020-03-10 17:58:42 · 270 阅读 · 0 评论