- 博客(48)
- 收藏
- 关注
原创 深入理解Java虚拟机之垃圾收集器篇
在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的.
2025-05-21 20:28:49
928
1
原创 快速理解动态代理
动态代理是一种运行时生成代理对象的技术,其本质是通过字节码增强在不修改原始类代码的前提下,动态拦截并扩展目标对象的行为。它通过代理对象对原始方法的调用进行拦截,并在方法执行前后注入自定义逻辑(如日志、事务、权限校验等),实现逻辑与业务解耦。通过反射机制生成代理对象,适用于接口驱动的场景(如Spring AOP默认实现)。在此方法中,开发者可插入前置/后置逻辑,并通过反射调用原始方法。基于继承实现,通过修改字节码生成目标类的子类作为代理。JDK代理无法代理类,CGLib无法代理。类:用于动态生成代理对象。
2025-05-11 15:06:01
520
原创 33. 搜索旋转排序数组&&153. 寻找旋转排序数组中的最小值
旋转后数组如图所示, 它由两个递增部分组成, 我们使用二分查找需要在单调数组中进行, 那么我们只需要在该数组。这里我们比较三个已知点, nums[0], nums[mid], nums[n - 1].33题求旋转后数组中target的位置, 给定目标值, 直接查找即可.为什么可以直接二分查找?如何找到递增的地方?
2025-04-15 09:56:31
231
原创 230. 二叉搜索树中第 K 小的元素&&Morris遍历
以这个图为例子, morris中序遍历 就是建立2到3的连接,以便于在遍历完1-2子树后跳到3进而继续遍历。以上是我对morris遍历的理解, 以及对为什么morris遍历在leetcode通过不了的原因.这个方法没什么问题,因为中序遍历二叉搜索树返回的数组直接就是升序的, 我们直接取第k个元素即可。这个方法就有大问题了, 写这题的时候去了解了一下morris遍历, 发现本质就是,, 以便于跳出子树继续遍历。
2025-04-07 11:31:53
293
原创 146. LRU 缓存 && 带TTL的LRU缓存实现(拓展)
在原代码基础上为每一个steady_lock的timestamp时间戳, 每次get或者put已有Node时进行检测isExpired,如果检测已经过期则对get删除节点, 对put更新时间戳。
2025-04-04 11:18:18
853
原创 学习不应只是模仿
这篇文章算是有感而发吧, 语句不通顺还请见谅, 我自高考以来, 度过了大一以及第二个大一, 这期间要是让我提及一个值得让我自豪的事情, 我觉得我应该想不到一点.我单纯地觉得自己学习是摆烂式学习, 玩也是摆烂式玩, 与摆烂总有些干系.想想自己转专业到现在的计算机专业, 说我努力吗, 努力!走自己的路, 稳扎稳打.当我看见学长新发来的消息"**我的意思是,你得自己做,才能知道哪里能到啥程度**", 我沉默许久, 发现自己已经失去了思考的能力, 与学长的对话中, 只有无脑地追捧......
2025-03-25 22:38:36
350
原创 146.LRU缓存
先前我在实现put操作时使用了containsKey,这使得我原来的代码时间消耗很高。如果不存在key,则为添加, ++size, 需要判断容量;容量超过,则尾删, --size;用于操作链表的方法为removeNode, addToHead.如果存在key, 则为修改, 不需要判断容量;使用哈希表和双向链表解决(也可以LinkedHashMap)容量没超过, 则不删;以上两步均为操作,因此都得addToHead.
2025-03-07 11:22:13
498
原创 148.排序链表
以第一个结点为基准,每次比较cur.next与cur的大小,小则放入left链表,大则放入right链表.递归调用快排方法,每次调用可成功排序一个,如此进行O(n)次递归,每次递归有O(n)次迭代,即。实现最复杂的方法, 本质上是自底向上。方法二: 自顶向下归并 + 递归。最简单的方法,递归分治,步步拆解。方法一(超时): 快排。时间复杂度O(n2);
2025-03-07 09:40:15
222
原创 76.最小覆盖子串
为何less脱离了与 t 串无关的字符,而达到了只计算 t 串字符的效果呢?最优解法可谓异曲同工(都是通过两方差异量differ进行判断)第一遍过了,但是没有掌握最优解法。
2025-02-27 09:59:19
264
原创 560.和为k的子数组
点评: 做题想不到前缀和, 对前缀和的使用较为生疏. 另外对如何遍历有点头昏脑涨。法一: 枚举(或者暴力前缀和)法二: 前缀和+哈希表。
2025-02-25 11:43:53
232
原创 438. 找到字符串中所有字母异位词
法一: 使用数组作为介质比较滑动窗口里的子串和目标串是否相同。点评: 对字符串的题还停留在暴力解题的阶段, 没有考虑到。法二(想不出来): 优化滑动窗口。
2025-02-25 10:56:14
241
原创 【无标题】
3. 无重复字符的最长子串欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入MarkdownText-to-HTMLAuthorsJohnLuke。
2025-02-25 10:02:56
227
原创 力扣1049.最后一块石头的重量(01背包)之理解篇
我们采取的方法是将石头划为质量最接近的两堆,因为质量最接近,如果质量相等直接返回0.如果不相等,说明我们使用的01背包方法已经为我们找到了尽可能装满sumNum/2的最优解,即能够使得碰撞后剩下的最后一个石头最小,(我的疑虑是为什么结果不是一边剩下两块石头或更多,但实际上,这种情况并不会出现,因为如果出现这种情况,说明左右总大小还不是最接近sumNum/2的最优解),最优解就是保证了左右碰撞后只能剩下最后一个石头,并且其在所有碰撞结果中最小.
2024-12-13 11:36:55
577
原创 对回溯算法树层以及树枝去重的理解(使用used数组)
二刷的时候卡在这里了所以去重问题还是要好好钻一下.下面是我对树枝去重和树层去重的理解:借用代码随想录的图。
2024-12-02 10:59:01
240
原创 对力扣77组合优化的剪枝操作的理解
i是当前取何值,该限制条件就是i在当前所能取的值,既然i能在这取值,我们必须要保证下面的递归嵌套里面的for循环也能取到值(即基于该栈的后面的递归嵌套只能在i之后取值,我们要保证在这之后到n之间有足够的值保证path.size() == k),泡图书馆也600个小时了,感觉自己的学习效率也慢慢好起来了,也能坚持每天8-10个小时学习了,我想对自己说一句:再接再厉!我乍一看觉得想当然,但是仔细想想,又不知道以下剪枝代码作何解释,因此我想通过这篇文章简要解释一下。代码随想录放出了这一张图。
2024-12-02 09:34:59
466
原创 前缀和(acm徘徊期)
有一阵子没写博客了,最近一直在打acm和走后端之间纠结.起初我觉得就应该去试一试acm,但后来又仔细想了想,我觉得acm需要的成本是巨大的,一旦没有回报那就是浪费时间,虽然能够锻炼思维,可是我每天上午的算法时间也是在锻炼思维呀.这世上有多少我写不出来的题,又不是只有acm的题或者比赛才能锻炼思维.我认为我如果allinacm一年,我肯定有把握拿牌的不管是区域铜还是区域银.只是我的时间太紧迫了,我给自己的目标是:不读研,大二暑假或者在那之前,一定要去实习,原因很简单,我在乎物质.
2024-11-15 15:08:01
755
原创 一刷代码随想录!
11.9 今天,我一刷了代码随想录.从九月半开始到今天11月9号,历经54天.当我打开博客想要记录这一刻的时候,发呆了许久,想不到该写什么.那就憋一点出来[笑哭]
2024-11-09 11:20:40
281
原创 (代码随想录)leetcode300. 最长递增子序列
维护两个数组,简直要把我难哭了,主要是这个count的含义太难想了。似乎前面贪心算法做过,但是我想不出来贪心的做法[裂开]解释还是老实去看原文吧,期待自己二刷该题能ac。思路错了,自己死要去只遍历一遍。自己还是写不出来[笑哭]
2024-11-08 09:32:39
347
原创 (代码随想录)132. 分割回文串 II(动态规划)
第二种就是可以由[0, j]和[j + 1, i]两部分组成, 由于我们要求最小值,因此需要遍历[0, i]之间的j ,同时不停地求min值就行。dp数组由于需要疯狂地求min值,这里我把他设为每一个子串能切割的上限,即dp[i] = i;除了dp还要定义一个辅助数组,用于表示 i 区间到 j 区间是否为回文串.第一种就是0到i之间直接就是一个回文串,那么直接dp[i] = 0;4.j需要用到上一层i的值,因此i在外层,并从左到右遍历,j从0到i遍历。dp[i]表示0到i之间的字符串需要切割的最小次数。
2024-11-08 08:51:23
413
原创 (代码随想录)A*算法
A * 算法的时间复杂度 其实是不好去量化的,因为他取决于 启发式函数怎么写。最坏情况下,A * 退化成广搜,算法的时间复杂度 是 O(n * 2),n 为节点数量。最佳情况,是从起点直接到终点,时间复杂度为 O(dlogd),d 为起点到终点的深度。因为在搜索的过程中也需要堆排序,所以是 O(dlogd)。实际上 A * 的时间复杂度是介于 最优 和最坏 情况之间, 可以 非常粗略的认为 A * 算法的时间复杂度是 O(nlogn) ,n 为节点数量。
2024-11-01 09:42:24
792
原创 (代码随想录)floyd算法
floyd算法是求多源最短路径的算法,他是dikstra算法的拓展.重在理解,一定要理解该算法是怎么运作的,这样才能在实际应用中写出来.
2024-11-01 08:42:50
890
原创 (代码随想录)卡码网53.寻宝 prim算法初识(不熟练)
这一节我学了最小生成树相关知识以及prim算法,看的过程中是一头雾水,不过在看了代码实现后再回过头看知识也是逐渐理解了。以下是代码随想录官解(自己实在是写不出来([裂开])2.切记理解minDist数组的含义:即。
2024-10-29 10:51:46
288
原创 (代码随想录)图论篇卡码网 98. 所有可达路径
初次接触图论,还没开始就感觉比二叉树难,毕竟复杂程度就上了一个层次。这里是用了邻接表,还可以用邻接矩阵。98. 所有可达路径(卡码网)
2024-10-23 10:38:50
481
原创 (代码随想录)leetcode84. 柱状图中最大的矩形
代码随想录双指针解法:(至少我觉着这个和接雨水的双指针思路特别像)想不出来,hard终究是hard,不能轻敌。
2024-10-23 09:33:01
296
原创 (代码随想录)leetcode42. 接雨水
单调栈s.top()就是mid,当前值height[i]就是右侧最大值,s.pop()后的s.top()就是左侧最大值,这样就能利用长和宽计算在左右最大值之间,height[mid]之上的雨水,用result累加。真是的,刚说完题目简单,这道题直接给了我一个下马威,用单调栈写法死写也写不出来,只好做cv工程师了[doge]
2024-10-22 12:00:41
440
原创 (代码随想录)leetcode496. 下一个更大元素 I
只是在前面一题的基础上遍历了两遍nums,不过我很疑惑,这一题为什么是中等题,明明这一题比。刚刚那题简单多了,刚刚那一题差点没写出来[笑哭]
2024-10-22 11:06:22
367
原创 (代码随想录)leetcode115. 不同的子序列
/解释:两部分,因为目前s与t的最后一个字符相等,那么dp[i][j]有两个组成部分,一个是dp[i - 1][j - 1](这是比较s串与t串除去最后一个字符,t串在s中有多少个,因为最后一个字符已经相等了),一个是dp[i - 1][j](不把s最后一个字符算进去,那么我就得在s串的[0,i-2]区间计算有多少个t串)一道困难题,自己一如既往想不出来[笑哭]
2024-10-22 10:51:47
387
原创 (代码随想录)leetcode739. 每日温度
每当当前遍历的元素大于栈顶元素,那么就要计算result(s.top())的天数,并且移除栈顶元素,这样就形成了单调递增的栈,即单调栈。stack里面存放已经遍历过的元素的下标(目的是便于计算相差的天数)写这题之前没听说过单调栈,写了之后感觉很神奇。
2024-10-22 10:16:52
276
原创 (代码随想录)leetcode53. 最大子数组和 与 392. 判断子序列
昨天写的题,自己想不出来,看了题解也是似懂非懂,今天一看居然还找出了瑕疵,昨天写的是:dp[i] = max(dp[i - 1] + nums[i], dp[i])今天想了一下,不知道这个dp[i]是干啥的,于是又去思考了一番,才想到这应该是nums[i],奇怪的是这里写dp[i]居然还通过了.一看是简单题直接放松了警惕,然后写不出来(动规方法)[笑哭]这里我使用了滚动数组,但是这个很容易出错。
2024-10-20 09:42:06
196
原创 (代码随想录)leetcode714. 买卖股票的最佳时机含手续费
买卖股票有一系列题,希望自己能够好好掌握,加油!給拷打麻了[裂开],这一题写出来倒是心情好了不少。
2024-10-17 19:29:03
252
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅