笔记
禹哥。。。
这个作者很懒,什么都没留下…
展开
-
直接插入排序与希尔排序
直接插入排序基本思想: 每一步将一个代拍的数据插入到前面已经排好序的有序序列中,知道查完所有元素为止。算法实现过程:空间复杂度:不需要额外的存储空间,所以空间复杂度是O(1),是个原地排序算法稳定性判别(稳定性就是指相同的元素在排序的过程中被移动):对于值相同的元素,我们可以将后面出现的元素插入到前面出现的元素后面,从而保持了原有的前后顺序不变。时间复杂度: 最好的情况是待排序的数组已经排好序了,所以每次比较的时候只需要比较一个元素就能确定的那个要插入的位置,这种情况下的时间复杂度是O(n),原创 2021-12-06 14:14:20 · 1289 阅读 · 0 评论 -
归并排序详解
归并排序(MERGE-SORT) 是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 归并排序的原理: 假设初始序列合并n个记录,则可以看成是n个有序子序列,每个子序列的长度为1,然后两两归并……。如此重复,直至得到一个长度为m的有序序列为止、这种排序的方法称为2路归并排序。原创 2021-12-05 20:29:46 · 259 阅读 · 0 评论 -
克鲁斯卡尔算法&&并查集
现在我们来说另一种求最小生成树的方法——克鲁斯卡尔算法,我们知道最小生成树中不能有回路,所以遇到形成回路的边就跳过,但是我们怎么直到会形成回路呢?这时我们就要判断两个顶点是否连通,判断连通的方法有深搜和广搜,但他俩效率都比较低,更高效的方法就是并查集。 将所有顶点放入到一个并查集中,判断两个顶点是否连通,只需判断两个顶点是否在同一个集合中(即是否有共同的祖先)即可。 先来说说并查集,当读入一个连通边(u,v)时,先判断u和v是否在同一个集合中,如果是则不用合并;如果不是,则用一个合并(Un原创 2021-05-16 15:37:52 · 1759 阅读 · 2 评论 -
prim算法
prim算法是用来求最小生成树的算法,什么是最小生成树呢?对于一张n个点带权图,它的生成树就是用其中的n-1条边来连接这n个点,那么最小生成树就是n-1条边的边权之和最小的一种方案,简单的理解,就是用让这张图只剩下n-1条边,同时这n-1条边的边权总和最小。 prim算法的思想就是将n个顶点分为两类,树顶点和非树顶点,首先任意选择一个顶点加入生成树,接下来要枚举每一个树顶点到每一个非树顶点所有边,然后找到最短边加入到生成树中,照此方法,重复操作n-1次,直到将所有的点都加入到生成树中。原创 2021-05-16 10:56:44 · 563 阅读 · 0 评论 -
图的存储之十字链表
十字链表 emmm,邻接表解决了入度问题,逆邻接表解决了入度问题,但是怎样能既解决了入度问题又解决了出度问题?这就引入了十字链表了。 和邻接表相似,十字链表也分为数组和链表。数组内有一个数据域和两个指针域,数据域是来存顶点信息,一个指针域是指向以该顶点为弧头的结点,另一个指针域指向以该顶点为弧尾的结点。链表结点存储的是弧头,弧尾的数组下标,两个指针域域数组的指针域相同. 链表的定义如下:typedef struct node {//链表结构 int tailvex, headvex;//弧头原创 2021-04-28 21:53:59 · 160 阅读 · 0 评论 -
char,String 与int之间的相互转换
字符数字转化为int数字 char numChar='5'; int numInt=numChar-'0'; System.out.println(numInt);//5character数字转化为数字 Character ch2='8'; int nums2=Integer.parseInt(ch2.toString());//表示将ch2用10进制转换 System.out.println(nums2);//8数字转化为字符1.这种强制类型转换只是将其转换为对应的ASC原创 2021-12-02 09:25:22 · 432 阅读 · 0 评论 -
二叉树的分类
二叉树: 每个结点最多有两棵子树,左子树和右子树是有顺序的,就算只有一棵子树,也要区分是左子树还是右子树斜树:所有结点都只有左子树的二叉树叫左斜树,所有结点都只有右子树的二叉树叫右斜树满二叉树:所有的分支都有左子树和右子树,并且所有的叶子都在最下一层,非叶子结点的度一定是2,同样深度的二叉树中,满二叉树的结点个数最多,叶子数最多完全二叉树:从左向右编号,每个结点的标号与同样深度的满二叉树编号相同,称为完全二叉树,完全二叉树的叶子只能出现在最下两层,最下层的叶子一定集中在左部连续位置,倒数第二层,若有叶原创 2021-04-12 18:49:55 · 480 阅读 · 0 评论 -
剑指Offer 35 复杂的链表复制
题目中的图有点小,下面这幅图是样例一的放大版 我们先要知道复杂链表复杂在什么地方,它比我们正常的链表多了一个random指针。如果是正常链表的复制,我们定义一个尾指针,遍历到哪复制到哪,但是有了这个random指针这就不行了,因为复制这个random指针的时候,random指向的结点不一定存在,所以这个题不是一次遍历就能完事的。 我们先使用一个HashMap来记录当前结点和复制它的结点,它的key就是当前结点,value就是复制...原创 2021-11-26 13:35:34 · 244 阅读 · 0 评论 -
力扣 397 整数的替换 (dfs)
这道题我刚开始的思路是动态规划,然后交上去,内存爆了,数据太大了,虽说这个dp过不了,但是我还是想把它粘出来纪念纪念。class Solution { public int integerReplacement(int n) { int[] dp=new int[n+1];//表示从i到1的最少替换次数 dp[1]=0; for(int i=2;i<=n;i++) { if(i%2==0) {//如果i的偶数..原创 2021-11-19 20:13:56 · 299 阅读 · 0 评论 -
力扣 563 二叉树的坡度
说实话,碰到递归的题我还是挺害怕的,我不太清楚递归的传参,不知道什么时候返回,不知道返回类型,反正就是啥也不知道。今天借着这道题来帮助我理解一下递归。 首先可以根据样例的解释得出我们需要从下往上算,所以我们需要先递归到叶子节点,按照我们的习惯就是先左子树再右子树。所以需要先递归左子树,再递归到右子树。然后就是考虑下要传的参数和递归函数的返回值。我们先需要明确一些东西, 对于计数类型的递归,我们有两种传参和返回的方式。如果想在传参的...原创 2021-11-18 19:07:58 · 627 阅读 · 0 评论 -
优先队列与队列
在讲这道题之前,先说说什么是优先队列。他和普通队列有什么区别?普通队列是一种先进先出的数据结构,元素在队尾追加而从对头删除。在优先队列中,元素被赋予优先级,当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出的行为特征。通常采用堆数据结构来实现。 对于基本的数据类型的包装器类来说,优先队列中元素默认升序排序,但对于自己定义的类来说,需要自己定义比较器。//自定义比较器,降序排列static Comparator<原创 2021-11-16 21:30:52 · 1470 阅读 · 0 评论 -
力扣451 根据字符出现频率排序
家人们,这道题算是给我涨了知识了,就是使用数组记录字符出现的次数的时候,千万不要排序!!! 因为我们是使用数组下标来和字符对应上的,如果进行排序,数组下标就变了,就和原来的字符对不上了。 我刚开始想的就是先记录每个字符出现的次数,然后排序,然后从大到小输出。然后就是光荣的错了。我也想过用HashMap,但是又想到HashMap不能排序,又放弃了,但是翻了题解以后才知道,我们可以用HashMap来记录字符出现的次数,然后使用list数..原创 2021-11-15 20:21:03 · 490 阅读 · 0 评论 -
什么是后台
什么是后台? 后台并不直接面向用户,而是面向运营人员的配置管理系统。后台为前台提供了一些简单的配置。前台、后台、用户之间的关系,可以用下图简单表示:为什么要有后台 后台是一个程序的命脉,任何一个互联网项目,都离不开健壮的后台。后台开发人员的主要工作? 后台程序员要跟数据库打交道,做数据的处理问题。根据正在处理的应用程序的大小和范围,后台开发人员要做的事情有很大的不同。但总体来说工作于都是对应用程原创 2021-10-31 00:15:40 · 4356 阅读 · 0 评论 -
设 计 模 式
设计模式是什么? 设计模式是一套被使用、多数人知晓的、经过分类编目的、代码设计经验的总结。为什么要使用设计模式? 使用设计模式是为了可重用代码,让代码更容易被他人理解、保证代码可靠性。设计模式的原则1.开闭原则:对扩展开放,对修改关闭。程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。2.里氏代换原则:一个软件如果适用于一个父类的话,那么一定适用于其子类,而察觉不出父类对象和子类对象的区别。也就是说,把父类替换成它的子类,程序的行为不会有变化,简单地说原创 2021-10-30 16:43:15 · 155 阅读 · 0 评论 -
堆排序
堆排序: ①堆的逻辑是一颗完全二叉树; ②它使用的是顺序存储(也就是数组); ③它的作用:一般都是用于找最值。堆排序的过程:1、建堆2、对建好的堆进行向下调整。(因为建堆是自底向上的且序列位于无序状态,所以建好堆以后要进行向下调整)但是为什么排升序要建大堆呢? 排升序的话,使用大堆是非常方便的,我们每次向下调整都可以得到剩余数据的最大值,即堆顶原创 2021-04-23 12:17:22 · 116 阅读 · 1 评论 -
树的表示方法
树的表示方法:双亲表示法:1,(只能找到双亲,要找孩子得重新遍历一遍)一个数据 域存的每个结点的名字,例如ABCD等,一个双亲域,双亲域存的是双亲所在的数组下标,根结点不存在双亲,所以对应的指针域为-12.(能找到孩子,增加一个结点左边孩子的域)增加一个存左边孩子下标的域,如果此这个数据域只有一个孩子,也算在这里,如果没有孩子,则直接存-1,存的是左边孩子的数组下标3.(关注孩子之间的关系)增加一个右兄弟域来体现兄弟之间的关 系,如果这个数据域有右兄弟,就存右兄弟的下标,如果没有,则存-1原创 2021-04-11 09:46:17 · 557 阅读 · 0 评论 -
洛谷 P1219 八皇后(搜索 java实现)
这题用到的思路就是深搜,但是深搜还是需要点优化,不然会超时。 for(int i=1;i<=n;i++) { boolean flag=false; if(!book[i]) { for(int j=1;j<step;j++) if(step-j==Math.abs(i-nums[j])) { .原创 2021-10-26 19:36:15 · 141 阅读 · 0 评论 -
力扣剑指offer 55-II 平衡二叉树 题解(java实现)
平衡二叉树为什么要有平衡二叉树: 便于查找平衡二叉树的概念:如果二叉树中任意结点的左右子树的深度相差不超过1,他就是一棵平衡二叉树。二叉树深度的计算:判断平衡二叉树的过程:1.计算左节点深度2.计算右结点深度3.计算左右节点深度的差值试判断下边的树是否是平衡二叉树来看下原因吧,每根线上边的数字表示左右子树的深度平衡二叉树中任何节点的子树都必须是平衡二叉树,这是为了约束这种对称,非平衡二叉树的情况实现思路:1.传入根结点2.若结点为空,则为平衡二叉树3.若左右节点不是平衡原创 2021-10-25 16:14:58 · 2782 阅读 · 0 评论