算法与数据结构
文章平均质量分 70
利于提升自我的算法与数据结构专题栏目
学习时长两年半的小学生
我要一步一步往上爬~
展开
-
堆排序(大根堆与小根堆)
是一种适用于关键字较多的情况下的排序算法,例如在十亿个数中选出前1000个最大值或者最小值如果在传统的排序算法中(例如冒泡,插入等),我们习惯把目标数据整体进行一次排序,再截取出前1000个最小的或者最大的。但是我们可以设想一下,从一开始我们目标就只要1000个,那么其实其余九亿九千九百九十九万九千个数据,我们压根不需要知道它们的排序顺序,只需要知道它们都比我们1000个目标数据中最大值都要大就可以了这就是堆排序。它的思想整体上非常清晰简单,结构上是一个完全二叉树。根结点比左右孩子都大则叫做大根堆。原创 2022-12-04 23:20:17 · 11072 阅读 · 2 评论 -
B树(BTree)与B+树(B+Tree)
类型3:X处于非终端结点,则用X的前驱或者后继关键字顶替X的位置,然后把对应的前驱和后继关键字删掉,变成删除终端结点的情况。原创 2022-12-01 17:33:37 · 2812 阅读 · 0 评论 -
ASL和二叉排序树
对照着生成树的图,如果查找元素比7还要小,则肯定查找失败,对应着结点7的左孩子位置为null,对比到结点7的左孩子位置,需要进行3次比较才能确认查找元素不存在(和29比,和13比,和7比,再下找没了,所以是3次比较),同一层中,空的还有16的左孩子结点(代表着大于13小于16的数据也是不存在,但是也要比较三次才能确认),32的左孩子结点(大于29小于32的数据),41的左孩子结点(大于37小于41的数据);查找第n个数据长度n。数据:7,10,13,16,19,29,32,33,37,41,43。原创 2022-11-28 11:26:59 · 4732 阅读 · 0 评论 -
图/图的存储/图的遍历
有向图就是边的指向是有方向区分的,例如从A->B ;从A可以到B,但是B不能到A(有向图的边是一个箭头,称之为弧,弧头是w,弧尾是v)无向图的边是无方向区分的,只要A-B,从A可以到B,从B也可以到A1:图一定不可以是空图,也就是说顶点集一定不能为空,边集可以为空2:完全图:若任意两个顶点之间都存在着边(注意这里的边是任意两个顶点直接相连的边),则称该图是完全图。无向完全图有n*(n-1) / 2 条边。有向完全图有n*(n-1) 条边3:子图:图中的某一部分顶点和一部分与顶点相连的边构成的新图,原创 2022-11-22 21:57:30 · 804 阅读 · 0 评论 -
哈夫曼树与哈夫曼编码
例如:根结点代表着快递集散点,一个叶子结点权值是5,在业务逻辑中代表着重量是5斤的货物📦,路径长度是3,业务逻辑代表着3公里,3 * 5 = 15 假设代表着从根结点开始配送这一件货物的成本 开销是15升汽油越重的物品,配送距离越长,开销越大,假设说每一层结点都有一个快递柜,只可以存放一件物品,这样就让收件人自己来取,而不用大老远送过去了,那么我们就应该优先把最重的物品,放在距离快递集散点(根结点)越近的位置。重量轻的(权值小的)小件物品我们可以送远一点。那么这个想法其实就是最短带权路径例:假设快递站今原创 2022-11-19 22:52:33 · 5195 阅读 · 1 评论 -
树/二叉树/森林之间的相互转换 与遍历
因为根结点没有兄弟,所以它仅有左孩子,所以从二叉树的左结点入手,找左结点的全部右兄弟,使它们连接到左结点的parent结点(下图虚线所示),然后断开兄弟之间的连线(打叉叉的地方),然后再从第一个兄弟的左结点继续往下找,依次。森林总结点数为m,即二叉树的总结点数也是m, 根p的右子树结点数有n个,我们根据森林转二叉树规则知道根结点的右子树都是由森林中其它树构成的,既然右子树结点n,也就是除了第一棵树外总的结点数n,所以第一棵树就有m-n个结点。如果是无序树,EF的位置就可以对换,还是同一棵无序树。原创 2022-11-18 18:13:47 · 1674 阅读 · 0 评论 -
二叉树的性质的结点数与高度的计算题
若有第七层,则第七层最多有:2^7-1 = 64 个结点,且第七层的全部是叶子结点,但是第六层要有8个叶子,也就是可以想象成第六层有8个结点没有生育能力,无法生孩子,那么第七层就会少 2*8 = 16个结点。因为完全二叉树只有六层,第六层不满,前五层满,根据公式,第五层有 2^5-1 = 16个结点,又因为第六层有3个叶子,3个叶子结点会占用第五层2个结点,所以第五层的叶子结点数: 16 - 2 = 14。要第七层结点最多,则第六层必须满,这样第六层的父辈才能往下生长结点,那么照推第五层也必须满…原创 2022-11-17 20:54:41 · 5135 阅读 · 0 评论 -
树的入门与习题
结点总度数 = 总结点数 - 1总结点数 = 结点总度数 + 1(一般考察的时候题目肯定要么给出总度数,要么给出总结点数,公式只是简单的 + 1 -1关系)巧记:根结点因为是所有子孙结点的祖宗,所以它比较老,头上一根毛都没有,求总度数(树家族成员总毛数)的时候,要记得仅仅根结点没毛,其它每个成员有一根毛,也就贡献一个度,N个成员N-1根毛理解:要使结点数最少,你想象你是一个抠门的大汉,要完成一个工程:高度H,度为M,要最少的结点数(预算)原创 2022-11-14 17:09:05 · 877 阅读 · 1 评论 -
第四章:串(KMP算法和KMP优化)
/ 复制数组 memcpy(s . ch , a , strlen(a));i ++) {} }1: 前两位固定0 12:从第三个位置开始,把子串往后挪动,找到左边线部分上下最大的匹配前缀,也就是左边线上下两字符串必须完全匹配;右边线的子串位置就是next数组下一次要比较的值的位置,也就是回溯位置。3: 若子串完全挪过中间线,也没找到两字符串匹配的位置,next数组值设为1;也就是它们已知的部分一个都匹配不上,只能从头第一个开始匹配。原创 2022-11-12 16:35:54 · 701 阅读 · 0 评论 -
矩阵的数组存储
(1)对称矩阵。即aij=aji,对称位置的元素相等的矩阵。对称矩阵可以从对角线划分成上三角区和下三角区,所以在存储时,可以仅存储上三角或者下三角部分,节省一半的存储空间。(2)三角矩阵三角矩阵往往只有上三角或者下三角的数据有意义,其余位置的元素为0或者为同一常量,这样在存储时,仅存储上三角或者下三角部分即可。(3)条带状矩阵(三对角矩阵)非零元素集中在主对角线为中心的区域。这种矩阵的存储和数组定位比较麻烦。分析,由于是nn对称矩阵,按照上面的理解仅需要存储上三角或者下三角部分,以上三角为例原创 2022-11-11 23:26:24 · 1849 阅读 · 0 评论 -
第三章:栈/队列 重点题
按照题目的输出序列,第二个输出的必须是2,此时P3和P1中间隔着P2,所以必须P2出完,P1才能出栈,所以,P1绝对不可能是2,但是从P4~Pn都有可能是2,设 i 属于4~n范围内且Pi=2,则Pi进,Pi出,马上可以得到1,2的输出序列。当. top2 - 1 == top1 的时候,即第二个栈还想放元素,但是已经碰到第一个栈的栈顶指针了,即下一个位置已经是别人的栈顶,也就是共享栈已经满了,不能再放了,所以,当 : top2 - top1 = 1时,栈满。即所有元素都出队完了,此时是队空。原创 2022-11-09 21:47:46 · 714 阅读 · 0 评论 -
第一章:各种款式的算法复杂度例子+计算小技巧
(1)正确性。能正确解决问题。(正确)(2)可读性。易读,便于人们理解。(简单易读)(3)健壮性。有些也称之为鲁棒性(robust),是指软件对于规范要求以外的输入情况(非法数据等)的处理能力。(容错)(4)高效率/低存储。所谓高效率就是稍后主要演示的时间复杂度。低存储就是指算法执行过程中需要的最大存储空间。(运行时间快,占用空间小)时间复杂度一:加法规律。原创 2022-11-07 19:58:35 · 600 阅读 · 0 评论 -
自适应阈值法(图文总结)
概念:该方法网上很多很简洁但是很难懂的公式,本文章将会由简单例子入手,一步步去理解那些公式,但是不做代码实现,毕竟只要搞懂了这个算法的思想,代码的实现其实千变万化,甚至用CV库的话根本不用写代码。为啥出现这个二值化算法,OTSU的致命缺陷在哪里?在大津算法OTSU中,由于采取的都是全局均值求出最佳全局阈值,但是在图片光照不均匀的场景,很容易把稍微模糊的边缘目标图像当作背景,为了避免这种场景,我们就可以考虑更为细腻的局部自适应阈值,它是根据图像不同区域亮度,不断计算更新局部阈值,同时不断“刷新”局部图像原创 2022-03-31 15:05:09 · 10060 阅读 · 0 评论 -
大津算法OTSU(最大类间差法)
由日本人大津于1979年提出,基本思想就是,找到令前景和背景差距最大的那个T,就是最佳阈值(1)对于图像I,设T为前景与背景的分割阈值(初始化阈值),记住T是会浮动的,它会慢慢调整(2)根据上一步初始化定义的T:设前景像素点数占图像比例为W0,前景平均灰度值为u0设背景像素点数占图像比例为W1,背景平均灰度值为u1(3)设图像总平均灰度 ut = w0u0 + w1u1(4)计算方差值Q=W0*(u0-ut)^2 + W1*(u1-ut)^2方差值越大,说明图像构成的两部分差别越大,在该点阈值原创 2022-03-31 10:04:55 · 1283 阅读 · 0 评论 -
双峰阈值法
概念:1996年,Prewitt提出了直方图双峰法,即如果灰度级直方图呈明显的双峰状,则选取两峰之间的谷底所对应的灰度级作为阈值。(横坐标是图像中各像素点的灰度级,纵坐标是具有该灰度级(像素值)的像素个数。)它认为图像由前景和背景组成,在灰度直方图上,前后二景都形成高峰,在双峰之间的最低谷处就是图像的阈值所在。例子:注意X轴是灰度值,Y轴是该灰度值的像素点个数(1)初始化:假设我现在有一张图片的灰度直方图如下,初始化双峰V1=(0,30),V2=(255,30),初始化阈值为th = 127此原创 2022-03-29 16:46:38 · 3333 阅读 · 0 评论 -
腐蚀与膨胀算法
(1)概念腐蚀与膨胀算法,是一种入门级基础的形态学处理算法,常见用于图形处理方面腐蚀操作可以消除噪点,同时消除部分边界值,导致目标图像整体缩小。膨胀操作可以使目标特征值增大,导致目标图像整体放大。他两组合起来使用,可以达到更好分割独立的图形元素的目的。核:腐蚀和膨胀算法的灵魂,也是最需要花心思设计的东西,根据目标图像的特征不同,要设置不同的核才能产生很好的效果更专业的叫法叫做“结构元素”,其中核心,也就是结构元素的中心点,叫做“锚点”,一般采用结构元素的影响区域的最小像素值去替换掉“锚点”的像素原创 2022-03-24 15:05:35 · 24436 阅读 · 9 评论 -
梯度下降算法
1:概念首先我们看下面一张图玩个游戏假设红色的点,是你目前站的地方(山顶)黄色的点,是你的目标地点(营地)你被空投到了雪山山顶,现在山顶美景欣赏完了,急着到山下的营地吃个饱饭睡个觉,那么这个时候就要下山,可是你不知道下山的路该怎么走/要走多久等等那么,怎么下?肯定不可能一下子跳下来,而是按照正常人的思维,找一条下山的路,一点点一点点分阶段往下(如下图)就像我们下山,都是先环顾四周,找到下一个比较低且路好走的地方,走过去,再站在那里找下一个比较低且路好走的地方,走过去,再站在那里……周而复始原创 2022-03-21 16:03:36 · 2543 阅读 · 1 评论 -
邻近分类算法---KNN(Java实现+公式计算例子)
名词解释:KNN:K-Nearest-Neighbor K值最邻近所以网上有好几种叫法:最近邻,邻近…其实都是指的KNN,其实按照翻译都对。KNN算法产生于1968年,是数据挖掘和数据分类技术中最简单的入门级算法。按照字面意思,就是计算出距离K值最近的邻居数据,设对应数据为X,然后把待分类数据归类为X。原理基于大量不同维度的训练数据,做循环比较分析,具体经历下面四步流程:①准备数据,对数据进行预处理 。②计算测试样本点(也就是待分类点)到其他每个样本点的距离 。③对每个距离进行排序,然后选择原创 2022-02-18 17:27:00 · 3842 阅读 · 2 评论 -
从局部变量表和操作数栈理解 i++ 和 ++i
两个概念:局部变量表:类被创建后的一小块内存区域,存放当前类的局部变量值操作数栈:栈帧中的一小块内存区域,专门用于存放计算的中间结果值三个点:1:赋值操作其实是把操作数栈中的中间结果值进行计算后再赋值给某个变量,是最后一步操作2: i++ 是指先把i放入操作数栈中,自身局部变量表中的i变量自增+13: ++i 是先把局部变量表i的值自增+1,再放入到操作数栈例子一:输出的b是多少,应该很多人都知道是1,因为大学时候老师说过a++是先使用a,再++但是a因为++了,所以是2执行过程:(原创 2022-02-08 17:07:08 · 1130 阅读 · 0 评论 -
Redis Cluster集群底层原理的面试题(持续补充ing)
怎么配置集群怎么用这里不会说的,在另外一篇博客会手把手教(1)环境下多节点的读写操作第一种,最简单的轮询,写入是最直观方便的,假设集群三个节点,那就1,2,3;1,2,3……循环地写,但是查找的时候,就困难了,必须一个个节点去翻,这显然不符合。还有随机写入模式就更不用说了,也是一样的问题。第二种,简单hash,也就是把对应的key对节点数量取模,找到对应的节点,既能解决写入的分配问题,也能解决读取问题,性能更优。但是当集群新增或减少节点的时候,所有缓存数据都要重新进行分配,不然同一个key,扩容/缩原创 2021-07-17 18:08:41 · 339 阅读 · 0 评论 -
坐标移动---牛客网
一开始理所当然用正则matcher.group()匹配出字母后面的数字,提交时候发现不能使用正则Matcher和Patternimport java.util.*;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Main{ private static final String reg = "\\d+$"; public static void main(String[] ar..原创 2021-05-13 17:05:53 · 157 阅读 · 0 评论 -
质数因子---牛客网大坑题
这道题目说是中等难度,但是真的很容易坑人,先看题目:坑一:题目说的所有“质因子”,其实是质数的因子,首先是输入数的因子,然后必须是质数,很直观的想法就是先把输入数的所有因子都列出来,再一个个判断是否质数,这道题就解决了。但是!它这题目很奇怪!例如180为什么会连续输出2 ???其实它的本意是:180 / 2 = 90;这里2是一个质因子,所以输出,再90 / 2 = 45 ,这里2又是一个质因子,又输出,再下来 45 / 3 = 15,3也是质因子,又输出…原来是输入数每次找到一个因子后!!都必须除掉原创 2021-05-12 17:50:45 · 544 阅读 · 1 评论 -
不声明第三个参数(临时变量)交换两个数的值+快速查找数组中只出现一次的数字+异或运算的底层原理
题目1:设数组{3,2,1,7,2,3,7},除一个数字外,其它数字都是成对出现,求如何快速找出只出现了一次的数字?解:public static void main(String[] args) { int[] array = new int[]{3,2,1,7,2,3,7}; int result = array[0]; for (int i = 1; i < array.length; i++) { result = r原创 2021-04-19 11:42:34 · 151 阅读 · 0 评论 -
动态规划:鸡蛋掉落问题图文解析+Java实现
题目:你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。你的目标是确切地知道 F 的值是多少。无论 F 的初始值如何,你确定 F 的值原创 2021-04-14 16:05:37 · 515 阅读 · 0 评论 -
最长公共子串(Java最简单实现)
思路:(1)首先把string转化成char[]数组,设两条string为char[] A 和 char[] B(2)外层i循环char[] A 拿出它里面的每一个元素作为相同子串的起始点(3)内层j循环char[] B ,用外层每一个元素判断是否在B数组中是否有起始点(4)如果有相同字符char,则立即记录下这个字符分别在char[]A 和 char[]B 的下标(5)基于上一步记录下来的下标++继续循环,看看有多长的连续,得到最长相同字符的下标i1,j1(6)使用i(相同子串起始下标),..原创 2021-03-03 09:37:00 · 4001 阅读 · 0 评论 -
阶乘之和(循环+递归实现)Java
阶乘之和给定目标值N,则N的阶乘之和是:1!+2!+3!+…N!其中1!= 11,2!= 12,3!=123……例如给定一个数字3.那么3的阶乘之和就应该是:11 + 12 + 123=9思路解析:(1)肯定有一个for循环,i++(2)肯定有一个求和的sum。每次计算出i的阶乘后加总求和(3)由于阶乘是不断相乘上去的,所以定义一个变量专门负责从1开始乘到N,例如 4!= 123*4,其实就是3!4=64,每一级新的阶乘都是上一级的基础上再乘当前的i代码实现的话有循环和递归两种方式p原创 2021-02-20 18:26:26 · 2051 阅读 · 0 评论 -
滑动窗口最大值列表(Java)
题目描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,.原创 2021-02-20 13:45:54 · 224 阅读 · 0 评论 -
贪心算法(Java实现+解析)
百度镇楼图,讲解概念好帮手~其实就是在某个前提下的最优组合,例如你打游戏爆了一地装备,背包有一定的负重,你要选择价值最高的装备捡。这里就是在价值最优前提下进行的最优组合。如果你在集某些套装,那么你就会挑选套装的装备捡,这就是套装优先前提下的最优组合,不可能说我又要价值最高又符合我的套装。思路:(1)首先要有一个物品的实体类,有三个属性:物品名称,物品重量,物品价格public class Goods {private String name;private Integer weight;pr原创 2021-02-19 16:20:50 · 1086 阅读 · 0 评论 -
N皇后(Java完整代码+最简单直观解析)
超经典的动态规划算法,超级能扩宽脑筋,应用场景超极广题目:解题思路:(1)第一步是马上构思一个N*N的棋盘,可以用一个二维数组char[][] chessboard实现,可以先初始化这个棋盘全部元素为null:private static char[][] chessboard = {{‘N’,‘N’,‘N’,‘N’,‘N’,‘N’,‘N’,‘N’,‘N’},{‘N’,‘N’,‘N’,‘N’,‘N’,‘N’,‘N’,‘N’,‘N’},{‘N’,‘N’,‘N’,‘N’,‘N’,‘N’,‘N’,‘原创 2021-02-19 09:53:37 · 1542 阅读 · 0 评论 -
反转字符串(Java实现)
把String换成Char[] ;然后倒序遍历出来,拼接成一个新的String返回即可public static void main(String[] args) { String str = "FEDCBA"; String result = solve(str); System.out.println(result); } private static String solve(String str) { String.原创 2021-02-07 16:41:27 · 118 阅读 · 0 评论 -
斐波那契数列(Java实现)
百度概念图镇楼基本上,这个入门概念,已经没什么思路分析了,就是很简单的一个for循环而已…还是分析一下吧从第三项开始,往后每一项都属于前两项之和,所以只需要区分 0 肯定返回0, 1和2下标都是1,从3下标开始,就是1+1=2了…其他没什么了,只需要不搞错下标就行。代码实现:private static int Fibonacci(int i) { if (i<=0){ return 0; } if (i<=2)原创 2021-02-07 16:28:08 · 268 阅读 · 0 评论 -
两数之和(暴力解法+优化)
这题目有点奇怪,我们都知道数组元素下标是从0开始的。它题目应该返回1,2,才是代表2+4=6,不管那么多,明白它需求的意思就开始分析思路思路很简单:(1)循环遍历所有元素(2)拿着每一元素与目标值做差(3)在剩余的元素里面找是否有刚好等于那个差值的(4)记录两个下标返回(5)如果不存在,返回nullpublic static void main(String[] args) { int[] array = new int[]{3,2,4,5}; int[] result = .原创 2021-02-05 10:02:53 · 350 阅读 · 0 评论 -
插入排序(最简单易懂讲解)---无序暴徒与有序良民的斗争
插入排序着实让我映像深刻,初学时被坑了一把,我看到有的博客说是生成一个新的有序数组,然后循环把待排序数组的每个元素拿去跟有序的比较,找到合适的位置插入对于这种坑爹博客,我只想说:耗子尾汁!首先讲整体思路:把待排序数组切成两部分两个队伍(良民与暴徒),一段是已经排好序的(良民队伍),一段还是乱序的(暴徒队伍),不断拿乱序那边的元素让它在有序的那一段找到最合适自己的位置,让它从乱序变有序,这个动作可以看成是让暴徒找准自己的社会定位,成为对社会有价值的良民,从而感化他那么故事就开始了~(1)混沌之初,一原创 2021-02-03 17:40:05 · 183 阅读 · 0 评论 -
合并有序链表(Java)
基于两个有序的链表融合成一个新的有序链表,首先了解链表的基本操作:Java实现双向链表结构(1)思路分析:既然是两条有序合并为一条,那么肯定要进行比较大小。那么我们就以第一条有序链表(A)为基础,循环拿另外一条(B)每个元素去比较大小,插入到合适的位置。如果B的元素小于A最前面的元素,则插入到A的最前面。如果B从某个元素开始比A的全部元素都大,又因为B是有序链表,这个就简单了,直接把B拼接到A的尾巴即可,无需再一个个比较。PS:由于链表有头尾两节点,在内存中属于分散存储,所以设置好头尾下一.原创 2021-02-03 09:42:21 · 539 阅读 · 0 评论 -
青蛙跳台阶最简单的递归解法
爬楼梯只有两种上法,一级或者两级每走一步,都会面临两种选择(上一级或者跳两级),不管做出哪种选择,都要递归把走完这步后的剩余楼梯阶数传给下一次,继续面临两种选择至于有多少种走法,必须是两种选择后产生的所有可能的总和拿个最简单的3级楼梯:已知1级楼梯仅剩1种走法,2级楼梯仅剩2种走法,得:1:第一次先走一级,那么只剩下两级,两级楼梯仅剩两种走法,所以返回22:第一次先走两级,那么只剩下一级,一级楼梯仅剩一种走法,所以返回1所以三级楼梯的全部跳法只有:2+1 = 3种,罗列出来:第一种:1,原创 2021-02-01 09:46:49 · 344 阅读 · 0 评论 -
最小的K个数(快排和冒泡分别实现)
关于冒泡和快速排序更加详细的解析在:Java实现的快速排序 冒泡排序和双向冒泡排序算法思路很清晰,其实考察在于排序算法,直接上快速排序和冒泡排序两种(1)Main方法public static void main(String[] args) throws IOException { int[] array = new int[]{4,5,1,6,2,7,3,8}; int k = 4; List<Integer> list = getLe原创 2021-01-29 16:02:45 · 200 阅读 · 0 评论 -
二叉树的先序,中序,后序三种遍历方式(Java实现)
首先了解生成二叉树:Java实现生成二叉树遍历的思路很简单(1)先序先序遍历意思是根节点在最前面,也就是根左右,找到叶子节点后,优先输出根节点即可private static void frontSearch(TreeNode tree) { // 先序遍历先打印出当前节点的值 System.out.println(tree.getValue()); // 先找左节点 if (!Objects.isNull(tree.getLeftN原创 2021-01-27 10:59:15 · 1174 阅读 · 0 评论 -
判断链表是否有环?
链表是否有环?首先了解自定义双向链表的实现:https://blog.csdn.net/whiteBearClimb/article/details/112978563先解释下有环的概念,有环的意思就是说,链表尾的下一个节点接回了头节点,这样导致了该链表会循环,永无尽头。方法1:自定义双向链表的时候,继承List,重写Size方法,每add方法新增一个Node节点,就Size++, 保证调用 XXX.Size() ;的时候能够返回自定义链表的长度。定义一个checkCycle方法,判断是否有环就原创 2021-01-22 14:02:38 · 680 阅读 · 0 评论 -
Java实现双向链表结构
LinkList是链表,如果我们要实现前后两个Node有关联能相互追溯,或者要实现一个循环♻️链表,可以按照自己思路实现。(1)仿照LinkList,创建一个链表类,包含前节点,数据,后节点。static class ListNode{ //当前节点数据 private Integer data; //后节点 private ListNode next; //前节点 private ListNode prev原创 2021-01-22 10:25:41 · 173 阅读 · 0 评论 -
Java实现的快速排序
(1)是什么?一种把乱序数组元素快速整理成有序的排序算法,时间复杂度是O(nLogn)(2)具体排序思路1:首先获取第一个元素当作排序目标,也就是第一轮的主要目的是把第一个元素放到准确的位置2:循环,先从右边找一个比目标数据小的,再从左边找到一个比目标数据大的,将这两个数据调换位置,然后继续从右边找一个比目标数据小的,再从左边找到一个比目标数据大的,继续调换位置,直到 左右两边游标重叠。使得左边全部数据比他小,右边全部数据比他大3:当第一个元素排好位置后,以它为中间点,切分成左右两段新数组,分别原创 2021-01-20 10:08:41 · 399 阅读 · 0 评论