- 博客(154)
- 收藏
- 关注
原创 Java_day30-35
这四种引用决定了对象的生命周期以及垃圾收集器如何收集垃圾。强引用:最常见的引用类型。如果一个对象具有强引用,那么垃圾收集器绝不会回收它。软引用:软引用用于描述一些还有用但非必需的对象。如果一个对象只有软引用指向它,那么在系统内存不足时,垃圾回收器会尝试回收这些对象。软引用通常用于实现内存敏感的缓存,可以在内存不足时释放缓存中的对象。弱引用:弱引用比软引用的生命周期更短暂。如果一个对象只有弱引用指向它,在进行下一次垃圾回收时,不论系统内存是否充足,这些对象都会被回收。
2025-04-23 21:32:48
733
原创 Java_day25-29
(1) 为什么是线程不安全的主要原因是它的操作不是原子的,即在多个线程同时进行读写操作时,可能会导致数据不一致性或抛出异常.**并发修改:**当一个线程进行写操作(插入、删除等)时,另一个线程进行读操作,可能会导致读取到不一致的数据,甚至抛出 ConcurrentModificationException 异常。非原子性操作:HashMap 的一些操作不是原子的,例如,检查是否存在某个键、获取某个键对应的值等,这样在多线程环境中可能发生竞态条件。(2)如何实现线程安全。
2025-04-23 18:18:22
686
原创 Java_day20-24
当把一个子类对象直接赋给父类引用变量,而运行时调用该引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态。重写的方法的访问级别不能低于被重写的父类方法,虚拟机在运行时根据对象的实际类型来确定调用哪个方法。方法的重载是编译时多态,指的是在同一个类中,可以有多个方法具有相同的名称,但是它们的参数列表不同(参数的类型、个数、顺序),可以有不同的返回类型和访问修饰符,通过静态绑定(编译时决定)实现。
2025-04-22 18:32:54
514
原创 动态规划_爬楼梯
所以我的原则是:不考虑dp[0]如何初始化,只初始化dp[1] = 1,dp[2] = 2,然后从i = 3开始递推,这样才符合dp[i]的定义。还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。从递推公式dp[i] = dp[i - 1] + dp[i - 2];所以dp[i] = dp[i - 1] + dp[i - 2]。
2025-04-02 22:52:37
242
原创 贪心_摆动序列
dp[i][0] = max(dp[i][0], dp[j][1] + 1),其中0 < j < i且nums[j] < nums[i],表示将 nums[i]接到前面某个山谷后面,作为山峰。dp[i][1] = max(dp[i][1], dp[j][0] + 1),其中0 < j < i且nums[j] > nums[i],表示将 nums[i]接到前面某个山峰后面,作为山谷。设 dp 状态dp[i][1],表示考虑前 i 个数,第 i 个数作为山谷的摆动子序列的最长长度。
2025-04-02 22:42:37
293
原创 回溯_组合总和III
返回 所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。我们说过,回溯法虽然是暴力搜索,但也有时候可以有点剪枝优化一下的。每个数字 最多使用一次。
2025-03-29 14:49:48
321
原创 数据库_day14-19
数据库查询的执行时间超过指定的超时时间时,就被称为慢查询。原因:查询语句比较复杂:查询涉及多个表,包含复杂的连接和子查询,可能导致执行时间较长。查询数据量大:当查询的数据量庞大时,即使查询本身并不复杂,也可能导致较长的执行时间。缺少索引:如果查询的表没有合适的索引,需要遍历整张表才能找到结果,查询速度较慢。数据库设计不合理:数据库表设计庞大,查询时可能需要较多时间。并发冲突:当多个查询同时访问相同的资源时,可能发生并发冲突,导致查询变慢。
2025-03-27 09:35:25
734
原创 Linux_day13
总结:select是最早的 I/O 多路复用技术,但受到文件描述符数量和效率方面的限制。一般来说,epoll 的效率是要比 select 和 poll 高的,但是对于活动连接较多的时候,由于回调函数触发的很频繁,其效率不一定比 select 和 poll 高。poll: poll是select的一种改进,它使用轮询方式来检查多个文件描述符的状态,避免了select中文件描述符数量有限的问题。select: select是一个最古老的I/O多路复用机制,它可以监视多个文件描述符的可读、可写和错误状态。
2025-03-27 09:23:09
511
原创 动态规划_斐波那契数
从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。因为题目已经把递推公式直接给我们了:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];F(n) = F(n - 1) + F(n - 2),其中 n > 1。dp[i]的定义为:第i个数的斐波那契数值是dp[i]确定dp数组以及下标的含义。
2025-03-26 21:42:01
373
原创 贪心_分发饼干
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。假设你是一位很棒的家长,想要给你的孩子们一些小饼干。大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。
2025-03-26 21:19:25
245
原创 二叉树_把二叉搜索树转换为累加树
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。其实这就是一棵树,大家可能看起来有点别扭,换一个角度来看,这就是一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13],是不是感觉这就简单了。那么知道如何遍历这个二叉树,也就迎刃而解了,从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。
2025-03-25 11:32:52
308
原创 二叉树_将有序数组转换为二叉搜索树
首先取数组中间元素的位置,不难写出int mid = (left + right) / 2;,这么写其实有一个问题,就是数值越界,例如left和right都是最大int,这么操作就越界了,在二分法 (opens new window)中尤其需要注意!给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。所以可以这么写:int mid = left + ((right - left) / 2);利用其有序性,迭代的方式还是比较简单的,解题思路在递归中已经分析了。
2025-03-25 11:11:17
144
原创 二叉树_修剪二叉搜索树
给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在 唯一的答案。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。利用其有序性,迭代的方式还是比较简单的,解题思路在递归中已经分析了。
2025-03-25 10:21:44
228
原创 二叉树_删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。利用其有序性,迭代的方式还是比较简单的,解题思路在递归中已经分析了。首先找到需要删除的节点;如果找到了,删除它。
2025-03-24 22:30:44
205
原创 二叉树_二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。你可以返回 任意有效的结果。利用其有序性,迭代的方式还是比较简单的,解题思路在递归中已经分析了。
2025-03-24 21:56:09
207
原创 二叉树_二叉搜索树的最近公共祖先
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]利用其有序性,迭代的方式还是比较简单的,解题思路在递归中已经分析了。给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
2025-03-24 21:40:01
249
原创 二叉树_二叉树的最近公共祖先
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
2025-03-23 21:06:19
138
原创 二叉树_二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。所以如果本题没有说是二叉搜索树的话,那么就按照上面的思路写!如果树中有不止一个众数,可以按 任意顺序 返回。结点左子树中所含节点的值 小于等于 当前节点的值。结点右子树中所含节点的值 大于等于 当前节点的值。既然是搜索树,它中序遍历就是有序的。左子树和右子树都是二叉搜索树。
2025-03-23 20:38:11
301
原创 二叉树_二叉搜索树的最小绝对差
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值。差值是一个正数,其数值等于两值之差的绝对值。
2025-03-23 19:52:25
137
原创 二叉树_验证二叉搜索树
中序遍历,一直更新maxVal的节点,一旦发现maxVal >= root->val,就返回false,注意元素相同时候也要返回false。可以递归中序遍历将二叉搜索树转变成一个数组,然后只要比较一下,这个数组是否是有序的,注意二叉搜索树中不能有重复元素。我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。
2025-03-22 16:51:07
257
原创 二叉树_二叉搜索树中的搜索
你需要在 BST 中找到节点值等于 val 的节点。返回以该节点为根的子树。如果节点不存在,则返回 null。对于二叉搜索树可就不一样了,因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列就可以写出迭代法。例如要搜索元素为3的节点,我们不需要搜索其他节点,也不需要做回溯,查找的路径已经规划好了。对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向。给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
2025-03-22 16:25:26
277
原创 二叉树_合并二叉树
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。(opens new window)中的迭代法已经讲过一次了,求二叉树对称的时候就是把两个树的节点同时加入队列进行比较。给你两棵二叉树: root1 和 root2。注意: 合并过程必须从两个树的根节点开始。返回合并后的二叉树。
2025-03-22 15:53:38
345
原创 二叉树_最大二叉树
给定一个不重复的整数数组 nums。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。创建一个根节点,其值为 nums 中的最大值。返回 nums 构建的 最大二叉树。
2025-03-18 22:03:30
323
原创 二叉树_从中序与后序遍历序列构造二叉树
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树。此时应该发现了,如上的代码性能并不好,因为每层递归定义了新的vector(就是数组),既耗时又耗空间,但上面的代码是最好理解的,为了方便读者理解,所以用如上的代码来讲解。此时有一个很重的点,就是中序数组大小一定是和后序数组的大小相同的(这是必然)。
2025-03-18 20:52:26
193
原创 二叉树_路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum。如果存在,返回 true;否则,返回 false。本题要找出树的最后一行的最左边的值。此时大家应该想起用层序遍历是非常简单的了,反而用递归的话会比较难一点。叶子节点 是指没有子节点的节点。还可以简化为struct如下。
2025-03-16 17:46:50
155
原创 二叉树_找树左下角的值
本题要找出树的最后一行的最左边的值。此时大家应该想起用层序遍历是非常简单的了,反而用递归的话会比较难一点。给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。
2025-03-16 17:08:29
211
原创 二叉树_二叉树的所有路径
那么在如上代码中,貌似没有看到回溯的逻辑,其实不然,回溯就隐藏在traversal(cur->left, path + “->”, result);每次函数调用完,path依然是没有加上"->" 的,这就是回溯了。其实关键还在于 参数,使用的是 string path,这里并没有加上引用& ,即本层递归中,path + 该节点数值,但该层递归结束,上一层path的数值并不会受到任何影响。答案:因为更改了path的值,会导致没有回溯->,左边有节点的时候,会先加一个->,导致右边节点会多加一个-> .
2025-03-16 15:20:35
245
原创 操作系统_day9-12
死锁是系统中两个或多个进程在执行过程中,因争夺资源而造成的一种僵局。当每个进程都持有一定的资源并等待其他进程释放它们所需的资源时,如果这些资源都被其他进程占有且不释放,就导致了死锁。死锁只有同时满足以下四个条件才会发生:互斥条件:一个进程占用了某个资源时,其他进程无法同时占用该资源。请求保持条件:一个进程因为请求资源而阻塞的时候,不会释放自己的资源。不可剥夺条件:资源不能被强制性地从一个进程中剥夺,只能由持有者自愿释放。
2025-03-16 13:51:08
448
原创 二叉树_平衡二叉树
这个函数通过栈模拟的后序遍历找每一个节点的高度(其实是通过求传入节点为根节点的最大深度来求的高度)因为对于回溯算法已经是非常复杂的递归了,如果再用迭代的话,就是自己给自己找麻烦,效率也并不一定高。当然此题用迭代法,其实效率很低,因为没有很好的模拟回溯的过程,所以迭代法有很多重复的计算。然后再用栈来模拟后序遍历,遍历每一个节点的时候,再去判断左右孩子的高度是否符合。例如:都知道回溯法其实就是递归,但是很少人用迭代的方式去实现回溯算法!虽然理论上所有的递归都可以用迭代来实现,但是有的场景难度可能比较大。
2025-03-11 20:52:23
200
原创 二叉树_完全二叉树的节点个数
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(从第 0 层开始),则该层包含 1~ 2h 个节点。给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。使用队列进行迭代遍历、
2025-03-11 20:10:21
142
原创 二叉树_二叉树的最小深度
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。给定一个二叉树,找出其最小深度。使用队列进行迭代遍历、
2025-03-11 20:01:36
134
原创 二叉树_二叉树的最大深度
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。给定一个二叉树 root ,返回其最大深度。使用栈进行迭代遍历进行翻转、
2025-03-11 10:41:14
159
原创 计算机网络_day6-8
在这个阶段,发送方不会回到慢启动阶段,而是将慢启动阈值设置为当前窗口的一半,并将拥塞窗口大小设置为慢启动阈值加上已确认但未被快速重传的数据块的数量。随着每次成功收到确认的数据,发送方逐渐增加发送窗口的大小,实现指数级的增长,这称为慢启动。快速重传(Fast Retransmit): 如果发送方连续收到相同的确认,它会认为发生了数据包的丢失,并会快速重传未确认的数据包,而不必等待超时。如果窗口大小减小,发送方将减缓发送数据的速率。如果接收方的缓冲区快满了,它会减小窗口大小,通知发送方暂停发送,以防止溢出。
2025-03-10 21:56:28
495
原创 计算机网络_day1-5
OSI模型, 是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,将计算机网络通信划分为七个不同的层级,每个层级都负责特定的功能。每个层级都构建在其下方的层级之上,并为上方的层级提供服务。七层从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。虽然OSI模型在理论上更全面,但在实际网络通信中,TCP/IP模型更为实用。 TCP/IP模型分为四个层级,每个层级负责特定的网络功能。应用层:该层与OSI模型的应用层和表示层以及会话层类似,提供直接与用户应用程序交互的接口
2025-03-10 21:53:26
562
原创 计算机网络_简答
强缓存和协商缓存是HTTP缓存机制的两种类型,它们用于减少服务器的负担和提高网页加载速度。1强缓存:客户端在没有向服务器发送请求的情况下,直接从本地缓存中获取资源。强缓存通过HTTP响应头中的Cache-Control字段实现,如max-age,告诉浏览器在指定时间内可以直接使用缓存数据,无需再次请求。2协商缓存:当强缓存失效时,浏览器会发送请求到服务器,通过ETag或Last-Modified等HTTP响应头与服务器进行验证,以确定资源是否被修改。
2025-03-10 17:11:27
807
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人