- 博客(47)
- 收藏
- 关注
原创 day21-二叉树part08
5.遍历到删除节点,删除节点左右子树都不为空 将删除节点左子树头节点放到删除节点右子树下最左面节点的左孩子上,返回删除节点右孩子为新的根节点。思路:只需要在叶子节点上可以找到我们要插入的新节点位置,向上放回新节点给上一个节点进行操作。4.遍历到删除节点,删除节点左子树不为空右子树为空 返回左子树节点。3.遍历到删除节点,删除节点左子树为空右子树不为空 返回右子树节点。2.遍历到删除节点,删除节点左右子树为空,向上返回null。1.没找到删除节点,遍历到空节点直接返回。450.删除二叉搜索树中的节点。
2024-04-09 20:31:36
463
2
原创 day20-二叉树part07
思路:定义一个最小值变量,一个虚拟前节点 双指针中序遍历二叉树 以此遍历比较大小 遍历过程中记录最小差值。思路:中序遍历转换成有序数组,遍历数组计算数组相邻元素的差值保存最小,多开辟一个数组空间。思路1:将二叉搜索树通过中序遍历生成有序数组,通过map哈希进行统计 慢的出奇。思路2:双指针,记录每个节点个数以及节点最大个数。思路:看到有序数组想到二分法。思路1:使用map计数。思路2:遍历数组异或。530.二叉搜索树的最小绝对差。501.二叉搜索树中的众数。540.有序数组的单一元素。
2024-04-08 22:01:25
349
原创 day19-二叉树part06
思路二:在遍历中就进行大小比较,初始一个节点前面的值 相当于中序遍历 前一个节点与后一个节点连续比较,缺点:如果数据精度跟小就要变化。思路一:将二叉树中序遍历完保存一个数组 如果这个数组是从小到大 那么这就是一个搜索二叉树,缺点:增加了空间消耗多创建一个数组来存储节点元素。这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。在搜索值时无需想普通二叉树前中后序全部遍历,以及无需回溯。思路三:双指针 前一个节点与后一个节点进行比较。700.二叉搜索树中的搜索。队列迭代+搜索二叉树特性。
2024-04-07 22:31:23
405
原创 day18-二叉树part05
最底层最左边节点的值 先找到树的最深层,只要找到树的最深层无论是左节点还是右节点都是最左边节点的值。题目要求找到一条路径即可,递归函数返回值为boolean即可。递归偏难,反而迭代简单属于模板题。513.找树左下角的值。113.路径总和ii。
2024-04-07 01:32:50
354
原创 day17-二叉树part04
左叶子定义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。257. 二叉树的所有路径 (优先掌握递归) 前序遍历 根左右。110.平衡二叉树 (优先掌握递归)后序遍历 左右中。404.左叶子之和 (优先掌握递归)
2024-04-03 23:04:24
261
原创 day16-二叉树part03
104.二叉树的最大深度 (优先掌握递归)111.二叉树的最小深度 (优先掌握递归)222.完全二叉树的节点个数(优先掌握递归)
2024-04-03 20:55:16
296
原创 day15-二叉树part02
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。需要借用一个辅助数据结构即队列来实现,
2024-04-03 18:40:53
220
原创 Synchronized与ReentrantrantLock实现生产者消费者模式
synchronized与ReentranLockwait(),notify()方法只能在synchronized代码块中使用,底层是通过对象头中得锁监视器也就是说这是对象Object方法,一旦用了wait(),notify()方法那么这个synchronied就是重量级锁,wait(),notify()方法是是否锁监视器中得WaitSet。
2024-03-20 17:40:00
196
原创 day12-栈与队列03
思路:构造单调队列 队列第一个元素为最大值 只需要维护最大值不需要管其他值 实现三个函数。239. 滑动窗口最大值。347.前 K 个高频元素。
2024-03-18 17:50:12
186
1
原创 day11-栈与队列02
思路:使用栈 如果是({[ 就压入相反的进栈 不是就弹栈 如果相等就消除。注意点:左括号必需以正确的顺序闭合 并不是说左右括号各有就是对的。"({{[}]})"就是错的。
2024-03-17 15:20:58
157
原创 day10-栈与队列01
用栈实现队列 ,创建两个栈,一个输入栈一个输出栈 先将元素压入输入栈,弹出的时候将输入栈元素全部压入输出栈,这样就形成了先进先出实现队列了。232.用栈实现队列。
2024-03-15 11:34:23
229
原创 day08-字符串01
同样为交换字符串还是用双指针,因要满足上述条件,每次操作元素都为2k个因此可以每2k个进行遍历,获得2k元素中的前k个找到交换起始结束 start,end开始交换。对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。那么反转字符串依然是使用双指针的方法,只不过对于字符串的反转,其实要比链表简单一些。每隔2k个反转k个,尾数不够k个时候全部反转。思路:在反转链表中,使用了双指针的方法。个字符,其余字符保持原样。541. 反转字符串II。
2024-03-13 17:30:49
131
原创 day05-链表总结
思路:三步走,遍历链表 保存两节点交换下一个连接节点(临时节点) 虚拟头节点指向第二个节点 第二个节点指向第一个节点 第一个节点指向临时节点 同理后续交换。思路:构造虚拟头节点来处理第一位头节点 就无需处理头节点是目标值以及头节点后面连续是目标值,遍历链表找到删除元素,pre.next = cur.next;思路:快慢指针,采用虚拟头节点,快指针先走n+1步,后续快慢指针一起走,当快指针为null时,要删除的节点为慢指针的下一个节点。虚拟头节点一般用于删除元素用的,用来处理头节点删除逻辑。
2024-03-12 21:16:54
237
原创 day06-哈希表01
那看一下如何检查字符串t中是否出现了这些字符,同样在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作。最后如果record数组所有元素都为零0,说明字符串s和t是字母异位词,return true。先看暴力的解法,两层for循环,同时还要记录字符是否重复出现,很明显时间复杂度是 O(n^2)当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。定义一个数组叫做record用来上记录字符串s里字符出现的次数。这样就将字符串s中字符出现的次数,统计出来了。
2024-03-11 12:13:13
343
原创 day01-数组
数组理论基础文章链接:代码随想录704.二分查找 使用二分查找前提是数组为有序数组,同时题目还强调数组中无重复元素right代表的是搜索范围的右边界,而不是数组的实际最后一个元素的索引左闭右闭[left, right]class Solution { public int search(int[] nums, int target) { int left = 0;
2024-03-08 11:45:28
220
原创 Linux安装mysql
在首次启动MySQL后,MySQL会生成一个初始密码并存储在日志文件中。ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';在开始安装之前,首先确保您的系统已经更新到最新版本,以确保安装过程中使用的软件包是最新的。这是秘钥过期了,我们只需要在命令输入如下命令更新一下秘钥就行了。登录后,首先更改root用户的密码。将 '新密码' 替换为您希望设置的新密码。
2023-12-20 13:57:33
842
原创 Linux配置java jdk(手把手教程)
请确保你的JDK安装包是完整的,并且你正在使用与你的系统架构匹配的JDK版本。-bash: /usr/local/jdk1.8.0_381/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录。请注意,上述步骤中的 XXX 应该替换为你实际安装的JDK版本号。确保你的CentOS 7系统已经安装了32位的兼容库。请将 /usr/local/jdk1.8.0_XXX 替换为你实际安装JDK的路径,确保路径正确。保存文件并关闭文本编辑器。
2023-12-20 13:52:08
669
原创 Docker常用命令
docker是大容器,而镜像是一个只读的模板,而容器则是基于镜像运行的实例。docker run --network=xxx--name xxx 镜像名 sh /root/start.sh。因此,docker rm -f $(docker ps -qa) 命令会删除所有容器,不管它们是否正在运行。docker rm -f $(docker ps -qa) 用于删除所有的 Docker 容器。docker ps -qa 用于获取所有容器的 ID(包括正在运行和已停止的容器)。容器ID 查看该容器所处网段。
2023-08-18 11:26:32
1314
1
原创 NTP服务器
NTP 服务器在许多领域中都非常重要,特别是在计算机网络、通信系统、金融交易、科学实验等需要时间同步的应用中。它们确保各个设备具有一致且准确的时间,以确保系统的正常运行和数据的一致性。
2023-08-14 12:01:58
967
原创 事务失效的坑
2.@EnableAsepectJAutoProxy(exposeProxy = true) 对外暴露代理对象 开启aspectJ动态代理功能 以后所有的动态代理都是aspectJ创建的(即使没用接口也可以创建动态代理cglib)同一个service对象内事务方法互调默认失效 原因绕过了代理对象 事务是使用代理对象来控制。同一个对象内事务方法互调默认失效,原因 绕过了代理对象 就相当于把b,c方法复制过来。事务最大的一个特点就是aop代理 是使用代理对象来控制的。
2023-07-06 19:50:54
195
1
原创 synchronized和lock区别看这一篇就够了
而非公平锁,就是不管是否有线程在排队等待锁,它都会尝试去竞争一次锁。synchronized在性能方面和lock相差不大,在实现上会有一个区别synchronized引入了偏向锁,轻量级锁,重量级锁,以及锁升级的机制去实现锁的优化,而lock则用到了自旋锁的方式实现性能优化。并且我们可以通过synchronized加锁对象的生命周期,来控制锁的作用范围,比如锁对象是静态对象,或者类对象,那么这个锁就是属于全局锁,如果锁对象是实例对象,那么这个锁的范围取决于这个对象的生命周期。2.修饰在同步代码块上。
2023-06-29 14:49:07
184
1
原创 什么是面向对象,面向过程?
面向对象是一种以对象为中心的编程方法,它将程序的各个部分封装成对象并定义对象之间的交互关系。面向对象的编程强调的是“行为”与“状态”的抽象,便于代码的重用和扩展,同时也更易于组织和管理大型的软件系统。Java语言就是一种典型的面向对象的编程语言。面向过程是一个编程思想,就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了,以步骤为单位。面向对象是一种编程思想,是一种将现实世界理解抽象成对象的方法,通过对象之间分工与合作来解决问题,以对象为单位。
2023-06-08 19:14:01
423
原创 Raft算法理解
客户端发送一个请求到主节点(set 5) 即主节点现在是未提交的(set 5) 再又主节点下个心跳发送给所有follower节点 给所有节点同步(set 5) 然后大多数节点回复给主节点接收到(set 5)未提交 主节点提交(set 5) 响应给客户端 再又主节点下个心跳发送给所有follower节点 给所有节点同步(set 5)已提交。网络分区也可以保存一致性 分区上3下2 当下节点要改变数据由于只有两个节点不占多少 即不会成功 当合并 遵循轮数多的leader节点为新的leader节点。
2023-06-05 19:22:53
74
原创 Git常用命令
git checkout -b b0.2 v0.2 既创建一个b0.2分支来保有v0.2版本的所有文件 既然在v0.2版本的基础上创建一个新的分支进行改进。添加新功能一般添加一个新的 本地分支 用来写新代码 与主分支 master隔离 不影响master分支。git checkout -b [branch][name] 检出标签 既创建一个分支来指向某个标签。标签操作 Git中的标签,指的是某个分支某个特定时间点的状态.通过标签,可以很方便的切换到标记的状态。
2023-06-05 19:14:49
74
2
原创 索引是不是建的越多越好?
综上所述,确定合适的索引数量需要考虑到具体的业务场景和数据量大小,合理的索引数量可以大幅提高查询效率和数据访问速度,但是过多的索引反而会对系统性能造成负面影响。因此,在设计数据库时需要谨慎权衡索引的数量和类型。当表中插入、修改、删除数据时,都需要更新该表上的所有索引,这样会增加写操作的成本,并且如果索引数量过多时,更新索引所需的时间也会变得相应地更长。每个索引都要在磁盘上占用一定的空间,随着索引数量的增加,存储空间的使用情况也会相应地增加,这可能会使得MySQL运行缓慢,尤其是在内存受限的情况下。
2023-04-18 20:35:30
2865
原创 InnoDB和MyISAM的区别
4.自动增加字段(AUTO_INCREMENT):当插入新行时,InnoDB使用类似锁的机制(如Next-Key Locking)防止交叉写入(比如重复主键),因此会更安全,而MyISAM则不会检查约束。综上所述,InnoDB倾向于高并发和数据可靠性、稳定性,并且支持事务,因此被广泛应用于企业级数据库应用开发;2.锁机制:InnoDB采用行级锁定机制,可以在高并发环境下提高性能,并且避免了表锁的情况。MyISAM虽然速度快,但在不停电的情况下,很容易发生数据损坏或者失败,需要人工修复。
2023-04-17 20:29:14
592
原创 InnoDB为什么要设置主键?
在InnoDB存储引擎中,主键索引被称为聚集索引。因为在该存储引擎下,数据按照主键的逻辑顺序存储,该叶子存储不仅存储索引也存储数据,所以使用主键索引查询或排序操作会更加高效。总之,在InnoDB存储引擎中,主键不仅起到了标识记录的作用,还可以提供高效的索引结构,并加速了关联查询和其他表之间的数据评价。这些复合的主键字段可以被认为是组成一个复合索引,使它们能够在查询时进行更有效的利用。InnoDB存储引擎使用了B+树的数据结构来实现索引,这种结构使基于主键的关联操作变得非常快速和高效。
2023-04-13 20:44:03
484
原创 唯一索引与主键索引的区别
但是,在设计主键时,推荐将其定义为int类型,在创建时设置自增长,这样可以有效减少页面分裂和提高MySQL硬盘的读写速度,而在InnoDB存储引擎下则没有此限制。对于InnoDB存储引擎来说,如果使用主键进行查询或关联操作的话会比较高效,因为主键索引的叶子节点就存放了整行的数据,这被称作聚簇索引(clustered index)。总之,在某些情况下需要唯一索引,而对于用于标识行和避免重复记录的字段来说,应该使用主键约束。而在实际情况下,需要根据实际需求来选择适合自己的索引类型。2. 可以定义的数量上不同。
2023-04-13 20:35:27
1001
原创 java如何连接mysql数据库
上述步骤中,第1步需要导入MySQL驱动类库,确保应用程序中有MySQL JDBC驱动的jar包;Java连接MySQL数据库的底层原理是通过JDBC驱动实现的。MySQL JDBC驱动是由MySQL官方提供的一个Java类库,其中包含了MySQL数据源、数据连接和SQL执行等功能,通过这个驱动,Java程序可以与MySQL数据库建立连接并进行数据操作。总之,Java连接MySQL数据库需要借助JDBC驱动实现,该驱动库包含了与MySQL数据库交互所需要的类和方法。
2023-04-12 20:29:38
341
原创 java连接mysql底层原理
当调用DriverManager.getConnection()方法时,会根据传递给该方法的URL、用户名和密码等信息来寻找注册的合适的数据库驱动,并通过连接URL中指定的协议创建与目标数据库的连接。同时请注意,从MySQL 8.0版本开始,MySQL JDBC驱动类库已经改为了com.mysql.cj.jdbc.Driver,原有的com.mysql.jdbc.Driver类已被弃用,若要在新版本的MySQL中使用JDBC,需使用新的驱动类名。这个过程叫做动态加载。
2023-04-12 20:27:12
272
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人