自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 收藏
  • 关注

原创 JavaEE初阶第二期:计算机是如何 “思考” 的(下)

简单来说,当你打开一个应用程序(比如浏览器、文本编辑器、游戏),操作系统就会为它创建一个或多个进程。比如当我们打开任务管理器的时候,第一个标签页就是进程,里面的内容就是在这台运行起来的程序,也就是进程。描述:操作系统使用结构体把一个进程的关键属性表示出来,这样的结构体还有一个统称,PCB(进程控制块)。这个名称适用于各种操作系统,但具体到不同的操作系统上,会有专门的对应的名字,比如在Linux上称为task struct。组织:操作系统使用一定的数据结构,把上述对象变量组织起来,从而实现增删查改的功能。

2025-06-15 20:12:32 575

原创 JavaEE初阶第一期:计算机是如何 “思考” 的(上)

寄存器和内存都是计算机中用于存储数据的重要组件,但它们在功能、速度、容量和用途上有着显著的区别。CPU,全称中央处理器,被誉为计算机的“大脑”。它是计算机的核心计算单元,负责解释计算机指令、处理计算机软件中的数据,并管理计算机的各项操作。CPU和程序员的关系是非常密切的,因为程序员写的代码都是靠CPU运行的。内存速度较慢、容量较大、成本较低、易失性(大多数RAM是易失性存储器,这意味着当计算机断电时,存储在内存中的数据会丢失)。常见的指令类型有数据传输指令、算术指令、逻辑指令、控制流指令等。

2025-06-14 21:23:47 801

原创 动态规划算法的欢乐密码(二):路径问题

这里与上一题不同的是,上一题的参数是两个整数,这道题是一个二维数组,需要注意下标的映射,原始数组的下标与填表时的下标是[i-1][j-1]。接下来根据最近的一步划分问题,如下图所示,可以从A、B、C到达最后一行,那么此时的最小路径和分别为dp[i-1][j-1](表示为x)、dp[i-1][j](表示为y)、dp[i-1][j+1](表示为z),到达最后一行的状态表示dp[i][j]为前一个位置的最小路径和再加上它本身,所以状态转移方程为dp[i][j]=min(x,y,z)+matrix[i][j]。

2025-06-13 22:38:55 1133 1

原创 二叉树深搜:在算法森林中寻找路径

根据前面学过的知识,对一棵二叉搜索树进行中序遍历,得到的结果是一个有序序列,所以我们可以先定义一个全局变量prev,当遍历到某一个节点时,用prev存储前一个节点值,如下图所示,根据中序遍历,当我们遍历到1时,将prev赋值为1,然后进行比较,后面的数如果越来越大,那就是二叉搜索树。当我们遍历到某一节点时,如果发现左右子树均为空,并且节点值为0,那我们就可以把这个节点剪掉。从根节点出发,先去遍历左子树,当遇到叶子节点时,返回该节点的布尔值,然后回溯到它的父亲节点,然后遍历右子树,再回溯父亲节点并遍历自身。

2025-05-15 19:56:36 1334 58

原创 MySQL数据库精研之旅第十期:打造高效联合查询的实战宝典(一)

一次查询需要从多张表中获取到数据,成为联合查询,或者叫表联合查询。在数据设计时由于范式的要求,数据被拆分到多个表中,那么要查询⼀个条数据的完整信息,就要从多个表中获取数据,如下图所示:要获取学生的基本信息和班级信息就要从学生表和班级表中获取,这时就需要使用联合查询。

2025-04-23 22:53:56 1725 105

原创 动态规划算法的欢乐密码(一):斐波那契数模型

当我们支付cost[i]向后走两步到达i+2位置时,再从i+2位置到达终点,花费为dp[i+2]+cost[n],所以递推公式为dp[i]=Math.min(dp[i+1],dp[i+2])+cost[i]。而题目也已经将前三个状态给了出来,dp[0]=0、dp[1]=1、dp[2]=1。接着利用之前的状态来推导dp[n]的值,根据最近的一步或者两步来划分问题:先到达dp[n]的前一个位置dp[n-1],然后支付cost[n-1]走一步,到达dp[n]花费为dp[n-1]+cost[n-1];

2025-04-19 20:48:26 1189 75

原创 MySQL数据库精研之旅第九期:深入数据库设计的智慧迷宫

在⼀个表中出现了两个强相关的关系,而且这两个强相关关系又存在传递现象,即通过学生Id可以找到学生记录,学生记录中包含学院名,每个学院又有自己的电话和地址。关系数据库有六种范式:第⼀范式(1NF)、第⼆范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式),越高的范式数据库冗余越小。比如我们登录优快云账号时,账号与密码可以保存在一个账号,登录成功之后,会显示自己的用户信息,一个账号对应一个用户,那我们就可以创建两张表user和account。

2025-04-17 15:42:31 1207 68

原创 MySQL数据库精研之旅第八期:玩转数据库约束

指定了唯一约束的列,该列的值在所有记录中不能重复,比如⼀个⼈的身份证号,学生的学号等。之所以要使用外键,是因为外键可以更方便地维护数据,比如上图中班级编号就可以简化为1个数字,又比如在填表过程中填到一半,系统出现了崩溃,导致数据不全。通常把主键列设置为自动增长,让数据库维护主键值,这样我们写入数据时,不用人为的去维护主键值,只需要写入业务值即可。外键约束也是对数据的一种校验,从表中使用了主表中的某个值,这个值必须存在于主表中。应用于⼀个或多个列,用于限制列中可接受的数据值,从而确保数据的完整性和准确性。

2025-04-15 15:27:19 1737 73

原创 巧用递归算法:破解编程难题的“秘密武器”

递归与循环一样,都是去执行相同的子问题,那么二者之间是可以相互转化的,那么我们什么时候用循环迭代效率更好,什么时候用递归效率更高。如下图所示,递归的细节展开图与二叉树的深搜极其相似。我们要想将递归转化为循环的话,就得借助栈来实现,因为当我们遍历一个子问题,我们需要保存上一个的信息方便调用方法执行右侧。但一个递归的细节展开图越复杂时,用递归就比较好解决;如果展开图只有一个分支,用循环迭代就比较方便。

2025-04-12 15:53:06 1497 72

原创 优选算法的妙思之流:分治——归并专题

如果p1所指的元素比p2所指的元素大,那么p1后面的元素就都是比p2大,就可以快速的统计出数目,然后再让p2++。找完右区域的逆序对,然后对右区域进行排序。方法2也同理,如果nums[p1]>= nums[p2],就让p1向右移动,直到nums[p1]<nums[p2],再让p2向右移动,p1同样不用回退。当我们在左右区域里面分别寻找逆序对时,如果数组长度较大,那么我们还可以再接着划分,继续按照上面的思路来找出逆序对的总数,这个部分就可以在递归中完成,所以我们在处理一左一右时也可以排个序。

2025-04-06 21:29:07 1781 64

原创 MySQL数据库精研之旅第七期:CRUD的趣味探索(下)

可以创建⼀张与 t_recored 表结构相同的表,把去重的记录写⼊到新表中,以后查询都从新表中查,这样真实的数据不丢失,同时⼜能保证查询效率。因为*是SQL语言级别的,对于所有的数据库软件都通用,并且在MYISAM存储引擎中有一个变量记录了行数,count(*)就可以直接通过这个变量返回数据数量,效率相对来说更高。执行Delete时不加条件会删除整张表的数据,谨慎操作。AUTO_INCREMENT是自增操作,当插入一条数据时,当前列的值加1,数据库会自动帮我们维护这个值,并且这个值会被记录在数据库内部。

2025-04-05 20:55:10 952 60

原创 优选算法的妙思之流:分治——快排专题

接下来进行分类讨论:如果nums[i]=0,我们让nums[left+1]与nums[i]进行交换,然后i++,left++,就能保证[left+1,i-1]区间还都是1,还可能有一种极端情况,就是i=left+1,自身与自身进行交换,还是得需要left和i++,综上我们就可以写成nums[++left]与nums[i++]进行交换。第二种解法,利用大根堆,创建一个大小为k的大根堆,将数组的前k个元素丢进大根堆中,然后再将数组剩余的元素与堆顶元素比较,如果小就交换并调整堆,最后堆里面就是最小的k个数;

2025-04-05 00:02:43 1265 67

原创 MySQL数据库精研之旅第六期:CRUD的趣味探索(中)

至于原因:查询结果是根据表中的列或者是根据表中列进行运算的结果,from用来确定是在哪个表里面查,先经过where条件过滤,再返回到查询列表中得到我们想要的结果。上面这条SQL语句不能有效地去限制结果集的个数,这样的查询是不安全的,因为这样查询,结果集过大有可能会把服务器的资源消耗殆尽。并且两个列的值是在同一个数据中的,不能进行跨行比较,比如王五的语文成绩不能与钱七的英语成绩进行比较。指定了排序的列,返回的结果集是针对当前排序列进行排序的结果,排序是在额外的空间中进行的(使用的是临时表的空间)。

2025-04-02 08:02:47 1339 56

原创 优选算法的巧思之径:模拟专题

先初始化两个指针left和right,比较left和right是否相等,相等right就向右移动,当right的指向与left不相等时,right就停止,此时的left直接移动到right的位置。我们以示例1为例,先创建一个n行的矩阵,先向下填充,当x=n时,开始右上填充,当x=0时,又开始向下填充……如上图,k后面又是c,我们还需要给c记录上1,而我们要求的是所需不同青蛙的最少数目,所以我们从k里面借一个1,再去遍历最后一个"croak",最终k里面存的就是最终结果。当遍历到c时,哈希表中c加1。

2025-03-31 21:31:14 1519 69

原创 MySQL数据库精研之旅第五期:CRUD的趣味探索(上)

CURD是对数据库中的记录进行基本的增删改查操作:Create(创建)、Retrieve(检索)、Update(更新)、Delete(删除)。

2025-03-30 16:12:36 1327 67

原创 优选算法的慧根之翼:位运算专题

我们假设数组中出现三次的数字有n个,只出现一次的有1个,数组里的元素都是int类型的,我们从第0位开始遍历,让每一个数相同位数的比特位相加,那么它们的相加一共可以出现如下图4种情况。共包含6种&(按位与,有0就是0)、|(按位或有1就是1)、^(按位异或,相同为0,相异为1)、~(按位取反,0变成1,1变成0)、<<(左移)、>>(右移)。但我们需要注意的是,进位不是进到它本身这一位来,而是要进到左边这一位上来,所以我们还需要将按位与的结果左移1位,直到左移的结果为0。只需要将第x位修改为1,其他位不变。

2025-03-29 08:45:22 1434 38

原创 MySQL数据库精研之旅第四期:解锁库操作高阶技能

"ADD"表示添加,"FIRST"表示加到表的第一列,"AFTER"表示加到某一列的后面;"DROP"表示删除;前面我们讲到过,MySQL软件里面管理着很多数据库,数据库里面又管理着很多表,表里面又管理着很多数据行。"Field"是列名,"Type"是数据类型,"NULL"表示当前列是否可以为空,"Key"表示是否创建了索引,"Default"是当前列的默认值,"Extra"表示扩展信息。如果我们在可视化工具上查看,右键想要查看的表,点击“设计图”,表里面的数据行一目了然,尤其是在数据行比较多的情况下。

2025-03-26 21:19:32 1099 52

原创 优选算法的睿智之林:前缀和专题(二)

我们先来回顾一下二位前缀和的计算:dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + mat[i][j]。如果我们要在预处理矩阵dp[x][y]里面里的值,我们需要在mat[x-1][y-1]的位置找,在answer[x+1][y+1]的位置填入。我们先来思考暴力枚举:利用双指针left和right,当right移动到某一个位置时,left与right构成的区间之和为k时,此时right不能停止,数组元素可能为负的,有可能后面还存在和为k的子数组。

2025-03-26 08:32:10 1217 42

原创 MySQL数据库精研之旅第三期:数据类型背后的秘密

关于DECIMAL是如何实现精度不受损失的,其实是对一个大数每9位进行拆分,每一份用int来储存,int最大可以储存21亿的数字,再用诺干个int进行表示,而剩余的小数部分则用最小的数据类型来存储。对于文本类型和二进制类型,我们用记事本的形式打开一个Excel文档,会发现里面都是我们看不懂的一堆乱码,这就是二进制类型。我们知道,库是管理数据的最大集合,库里面有很多的数据表,表是由数据行构成的。类是⾯向对象中的概 念,对应到数据库中的概念就是实体,类中的属性对应实体中的属性。

2025-03-25 10:55:02 792 53

原创 优选算法的睿智之林:前缀和专题(一)

A区域的和可以很好的算出来:dp[i-1][j-1],但是B、C区域的和又不好算了。我们需要求的是某段数组元素的和,那么就可以利用前缀和思想,i左侧的元素之和f(i) = f(i-1) + nums[i-1],i右侧的元素之和g(i) = g(i+1) + nums[i+1]。第一步,我们先预处理出一个前缀和数组int[] dp,dp[i]代表的是arr数组区间[1,i]的和。而数组dp中每一个元素的算法不用再从头加到尾,直接利用递推公式dp[i] = dp[i-1] + arr[i]。

2025-03-23 18:46:29 994 39

原创 MySQL数据库精研之旅第二期:库操作的深度探索

已有库里面的“sakila”“world”这些属于测试库,我们可以进行修改或者删除的,“information_schema”“mysql”“performance_schema”“sys”这些都属于系统库,记录的是MySQL自身信息和一些配置项,其中也包含我们的用户名和登录密码。大括号里的内容必须存在;对字符集的编码,相当于两个人用不同的语言进行交流,一个人用汉语,另一个人用英语,他们就相当于对相同的内容进行编码。如果我们再去创建一个同名称的数据库,就会发出警告,并会告诉我们警告信息该数据库已经存在。

2025-03-22 16:14:33 1246 58

原创 MySQL数据库精研之旅第一期:开启数据管理新旅程

数据库是20 世纪 60 年代末发展起来的⼀项重要技术,已经成为计算机科学与技术的一个重要分支。数据库技术主要是⽤来解决数据处理的⾮数值计算问题,数据处理的主要内容是数据的存储、查询、修改、排序和统计等。SQL(Structured Query Language)是结构化查询语⾔的简称,是⼀种数据库查询和程序设计语⾔, ⽤于存取数据以及查询、更新和管理关系数据库。MySQL语言的学习本质也是SQL语言去操作数据库,SQL相当于一个标准,不同的厂商运行不同的数据库会略微有不同的差别,但总体还是在大的框架以内。

2025-03-19 15:27:33 1107 56

原创 优选算法的匠心之艺:二分查找专题(二)

通过上面的示例1,我们可以很明显地发现“二段性”,左边是严格大于某个值的递增区间,右边是严格小于某个值递增区间,并且数组中没有重复元素,折线表示如下图所示。从上图中我们已经可以看出,数组已经被分成两段,左边是递增的,右边是递减的,符合“二段性”,可以利用二分查找。我们注意一个细节:如果给定的数组为[0,1,2,3],数组元素与下标都是一一对应的,而缺失的数字为最后一个元素加一。在缺失的数字之前,数组元素与数组下标是一一对应的,到缺失的位置时,缺失的数字比数组元素小1。或者是递增的,或者是递减的。

2025-03-17 14:55:52 2081 55

原创 Java数据结构第二十三期:Map与Set的高效应用之道(二)

扩容的时候还需要注意,比如我们要插入的元素的key为14,扩容前需要插入下标为4的位置,扩容2倍后,就需要插入下标为14的位置。理想的搜索⽅法:可以不经过任何比较,⼀次直接从表中得到要搜索的元素。我们的基本思路是:利用HashSet,先遍历一遍数组,把集合中没有的数字放入,如果有,再移除,最后集合中剩下的元素就是只出现一次的数字,再遍历一遍数组,匹配HashSet中的数组。由于我们哈希表底层数组的容量往往是小于实际要存储的关键字的数量的,就会导致冲突的发⽣是必然的,但我们能做的应该是尽量的降低冲突率。

2025-03-15 21:26:26 1302 39

原创 优选算法的匠心之艺:二分查找专题(一)

当x与目标值进行比较时,left可以移动到x右边,那么x的左边已经判断过了都是小于目标值,但右边还是未知的,即使left与right相遇,那这个数依然是未知的。right指针移动的时候,一直是在合法的区间,left一直想要跳出这个不合法的区间,直到两个指针相遇,无需判断,相遇的位置就是我们要找的结果。我们先来思考暴力解法:由于x是非负整数,那么x的平方根定义是小于等于x的。如果x=17,我们可以从1开始向右枚举,如果找到一个数n,n*n小于等于x,且(n+1)*(n+1)大于x,则x的平方根则为n。

2025-03-14 20:58:02 1262 54

原创 Java数据结构第二十二期:Map与Set的高效应用之道(一)

上面的TreeMap传给了m,m是NavigableMap类型的,而NavigableMap又继承了Map,我们再来看add方法,里面的e接收了key,PRESENT接收了value,而这个PRESENT又是一个Object类。对有n个结点的⼆叉搜索树,若每个元素查找的概率相等,则⼆叉搜索树平均查找⻓度是结点在⼆叉搜 索树的深度的函数,即结点越深,则比较次数越多。如果相等,直接返回这个结点。Map是⼀个接⼝类,该类没有继承⾃Collection,该类中存储的是结构的键值对,并且K⼀定是唯一的,不能重复。

2025-03-11 21:53:12 1369 42

原创 Java数据结构第二十一期:解构排序算法的艺术与科学(三)

我们先定义三个指针,先让三个指针同时指向三个数组的第一个下标,比较nums[s1]与nums[s2]的值。我们对数组里的元素进行分组,每一个单独的元素都是有序的;由于合并需要3个参数,根据上一种做法的分析,left=i,mid=left+gap-1,right=mid+gap。类似于快速排序,利用数组下标的中间值mid进行分解,当left=right时,说明左树已经分解完毕,然后再去分解右树,然后再进行排序与合并。这样临时数组中储存的就是有序数据,但原数组还不是有序的,我们将临时数组拷贝到原始数组中。

2025-03-09 20:58:13 6080 28

原创 Java数据结构第二十期:解构排序算法的艺术与科学(二)

这种选择排序的思路是从首尾找,起始两个值接收下标都为0,利用i去遍历数组,找出最大值与最小值下标,再让left下标的值与MinIndex下标的值交换,right下标的值与MaxIndex下标的值交换。无论是递归左边还是右边,与上面的过程都是一样的。与上面的方法类似,我们依然是以6为基准值,把6存进tmp中,right向左移动,遇到比6小的数,把6之前的位置填上;但我们一运行,就会发现,排序出现了问题,这是因为,如果最大值或最小值本身就在首尾,那么一交换,最大值或最小值就会跑掉,,所以我们还需要判断一下。

2025-03-09 00:42:52 6409 36

原创 Java数据结构第十九期:解构排序算法的艺术与科学(一)

插入排序的过程:让i从第二个元素为起始位置,j=i-1,当arr[j]>arr[i],用tmp接收i下标的值,让j下标的元素向前移,然后让j--,如果tmp的值大于j下标的值,就把tmp的插入j的后面;假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的 相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之 前,则称这种排序算法是稳定的;如果gap非常大的时候,那么j回退的次数就越少,几乎可以认为是常数。

2025-03-07 23:21:13 1444 49

原创 Java数据结构第十八期:探索优先级队列的魅力(二)

我们来看一下Integer里面的源码,在Structure里面找到compare(int ,int),因为10>5,进不来上面的循环,就可以走下面的代码,再把0下标给到5元素,从而实现小根堆。除此之外,还有第三种解法,就是利用大根堆。先建立一个大小为k的大根堆,从数组的第k+1个元素开始遍历数组,如果数组元素比堆顶元素小,则交换,遍历结束之后,大根堆里的元素就是最小k个数。offer的源码如下,从下面的逻辑中可以看出,它的向上调整是一个一个实现的,而不是直接去调整一个数组,所以下面的时间复杂度是。

2025-03-07 10:56:06 1135 11

原创 Java数据结构第十七期:探索优先级队列的魅力(一)

队列是⼀种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先 级,⼀般出队列时,可能需要优先级⾼的元素先出队列,在某些场景下,比如在手机上玩游戏时,有人打电话,系统就会优先处理打过来的电话。对于元素的删除,我们先删优先级最高的“65”,这个方法非常巧妙:我们先把"65"与最后一个结点下标的元素进行交换,再利用向下调整再变成大根堆(在这个过程中65不参与调整)就是左结点,但有可能这个左结点是不存在的,所以我们需要判断这个下标是否是合法的,并且不能只判断一次,因为c会随着p的值发生变化。

2025-03-06 11:01:06 5737 35

原创 优选算法的智慧之光:滑动窗口专题(二)

只不过这次的count是统计字符的种类,因为在找字母异位词时,子串和字符串是一一对应的关系,这里字符却是大于等于的关系。我们看下图,我们从s中找出一段符合要求的子串,然后让left向后移动一步,此时会出现两种情况,要么缩小的区间还是符合要求,要么不符合要求,我们就让right向右移动,并且在这期间right是不需要回退的。我们还是先来思考一下暴力解法:先定义两个指针,我们以其中一个指针为起点,另一个指针向右移动,找到所有符合条件的子串,从里面挑出最短的长度。进窗口,把s中的字符串丢进哈希表中统计。

2025-03-03 23:06:35 6581 67

原创 Java数据结构第十六期:走进二叉树的奇妙世界(五)

当遍历到4时,左子树为空,返回结点4并弹出,再去遍历4的右结点,然后返回结点2并弹出,让cur等于结点2的右子树并遍历。代码写到这里就会出现问题,原因是:当遍历到结点4的时候,4的左子树为空,就无法进入while循环。然后把4弹出去,让cur=top,问题又来了,如果结点4左边要是不为空,又得放入栈中,也需要走while循环。如下图,前序遍历肯定是先将根结点放进去,如果是队列,根结点先进先出,然后怎么去遍历右子树呢,就无法打印的顺序了。但这样写,会存在问题:当遍历到结点5的右结点7时,会陷入死循环。

2025-03-02 14:21:14 888 38

原创 Java数据结构第十五期:走进二叉树的奇妙世界(四)

我们以中序遍历的数组的第一个元素ibegin,最后一个元素iend之间找到二叉树的根,因为是前序遍历,先有的左树再有的右树,那么左边的区间就会是(9,x) = (ibegin,iend),iend = iroot-1;再继续往下走,如果root.right为空,正好符合上面2结点的情况:2的左边走完,右边为空,直接return加右括号。通过上图分析:当1的左子树不为空,就用一个(,2的左子树也不为空,也使用一个(,4再往下递归返回null,直接)闭合;当root的左树不为空,右树为空,也加右括号闭合。

2025-03-01 19:34:26 1280 33

原创 优选算法的智慧之光:滑动窗口专题(一)

因为数组是具有单调性的,两个指针不用回退,就可以省去很多不必要的枚举,让子数组里的元素不停进出,维护更新子数组的和。是不需要的(如下图所示),right要么不动,要么向右移动,此时又符合同向双指针的解法,也就是可以使用滑动窗口。我们取出一段子数组,里面的水果种类kinds恰好为2,此时让left向右移动,会出现两种结果:kinds不变,right也不需要向右移动;“判断”,当子数组的和大于target时(这里不写等于,是为了防止代码书写混乱的),left指针向左移动,完成“出窗口”的操作;

2025-02-27 22:53:18 2010 57

原创 Java数据结构第十四期:走进二叉树的奇妙世界(三)

实现的逻辑也非常简单:求出每棵子树的高度,如果左子树的高度与右子树的高度之差小于等于1,则是平衡二叉树。看下面的三棵二叉树,上面的树存储的值相同,结构也相同;一棵树的本身就是它的子树,所以我们要首先判断两棵树是否相同,再去判断subRoot是不是等于root的左子树还是右子树,判断我们可以依照上面讲过的是否是相同的树来判断。要判断二叉树是否是对称的,也就是判断左右子树是否是对称的(如下图所示)。root.left与root.right是否是对称的,再判断下面的子结点是否对称,也就是递归的条件。

2025-02-26 00:15:56 6336 36

原创 Java数据结构第十三期:走进二叉树的奇妙世界(二)

同样的,我们上面已经实现了二叉树结点的遍历,我们也只需要再定义一个计数器,只要root不为空,countNode就递增。每一个节点的遍历顺序都是按照“根——>左子树——>右子树”的顺序来遍历,每遇到一个新的结点都看作是一棵新的树。求二叉树的高度,整棵树的高度等于左子树高度的最大值或者右子树高度的最大值加一,当root为空的时候,高度为0。中序遍历的顺序为“左子树——>根——>右子树”,遇到一个结点,先去遍历左子树,如果该节点的根为空,才能递归回来进行打印。上面的是遍历思路,还有一种子问题思路。

2025-02-24 22:15:55 6112 31

原创 Java数据结构第十二期:走进二叉树的奇妙世界(一)

树是⼀种⾮线性的数据结构,它是由n(n>=0)个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。有⼀个特殊的结点,称为根结点,根结点没有前驱结点除根结点外,其余结点被分成M(M > 0)个互不相交的集合T1、T2、......、Tm,其中每⼀个集合Ti (1 <= i <= m) ⼜是⼀棵与树类似的⼦树。每棵⼦树的根结点有且只有⼀个前驱,可以有0个或多个后继树是递归定义的注意,在树型结构中,子树与子树之间不能有交集,否则就不是树型结构。

2025-02-20 14:57:55 1895 44

原创 数据结构(Java版)第十一期:栈和队列(二)

第二种解决方案是牺牲一个空间,当存储元素的时候,判断下一个位置是否为front,如果是,就不再存储了;第三种解决方案是标记,定义一个isFull方法,初始,先假设isFull是false,每次元素入队时,检查rear和front是否重合,如果重合设置rear==front,isFull方法置为true。模拟出栈,先判断哪个队列为空,另一个队列中前n-1个进入的元素进入到空队列中,最后一个元素再出队列。如下图所示,左边是队列,只能出10,而右边的栈只能出20,所以一个队列无法实现栈。

2025-02-19 22:04:21 11574 33

原创 优选算法的灵动之章:双指针专题(二)

但此时还有一种特殊情况,如果复写之后最后一个元素为零,那么dest就会越界,所以我们还要单独处理一下边界,只需把倒数第二个元素直接复写成零,然后cur向前移动一位,dest向前移动两位。我们先对三元子数组进行去重,当我们left或者是right移动一位所指向的值不变,那么就继续移动,此时我们需要注意指针是否会越界。首先我们依然想到的是先排序,然后暴力枚举,利用三层for循环来判断三数之和是否为零,由于题目不要求输出的顺序和三元组的顺序,所以我们需要对三元组进行去重的操作,那么此时的时间复杂度就是。

2025-02-17 16:14:41 1330 48

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除