自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 力扣 88.合并两个有序数组

法一:暴力法i < n;i++){法二:倒序双指针 时间复杂度为O(m+n)从右往左地把nums2 合并到nums1 中如numsnums2=[4,5,6]while (p2 >= 0) { // nums2 还有要合并的元素// 填入 nums1[p1]} else {// 填入 nums2[p1]

2025-06-09 09:55:36 239

原创 力扣 232.用栈实现队列

思路:使用两个栈,将一个栈当作输入栈,用于压入 push 传入的数据;另一个栈当作输出栈,用于 pop 和 peek 操作。每次 pop 或 peek 时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。in2out();in2out();// 自己定义的方法:将输入栈的全部数据弹出并压入输出栈(2=to)while (!

2025-06-09 09:54:21 329

原创 垃圾回收相关八股

垃圾回收(Garbage Collection, GC)是JVM自动管理内存的一种机制,主要回收不再被程序引用的对象所占用的内存,减少内存泄漏和内存管理错误的可能性。• 特点:是最昂贵的操作,因为它需要停止所有的工作线程(Stop The World),遍历整个堆内存来查找和回收不再使用的对象,因此应尽量减少Full GC的触发。• 并发标记:从初始标记的对象(灰色)出发,遍历其所有引用的对象(将其标记为为灰色,原来了灰色对象自身标记为黑色)。• 灰色(Gray):已经访问到但未标记完其引用的对象。

2025-06-07 20:38:14 815

原创 java内存模型JMM

Java 内存模型(Java Memory Model,JMM)定义了 Java 程序中的变量、线程如何和本地内存以及主内存进行交互的规则。• 本地内存/工作内存:每个线程私有的内存空间,存储该线程使用变量的副本,每个线程只能操作自己本地内存中的变量,无法直接访问其他线程的本地内存。• 主内存:所有共享变量的存储区域,不管该实例对象是成员变量,还是局部变量,类信息、常量、静态变量都是放在主内存中。happens-before原则:定义操作之间的可见性关系,确保前一个操作的结果对后续操作可见。

2025-06-07 20:35:38 266

原创 力扣4.寻找两个正序数组的中位数

题解核心思路:通过二分查找的确定分割点使左右两部分元素数量相等。// 确保nums1是较短的数组,以优化二分查找} else {right = m1;// 处理边界情况m1 <= 0?m2 <= 0?return c1;m1 >= n1?m2 >= n2?

2025-06-03 16:17:08 308

原创 力扣 88.合并两个有序数组

法一:暴力法i < n;i++){法二:倒序双指针 时间复杂度为O(m+n)从右往左地把nums2 合并到nums1 中如numsnums2=[4,5,6]while (p2 >= 0) { // nums2 还有要合并的元素// 填入 nums1[p1]} else {// 填入 nums2[p1]

2025-06-03 16:16:01 354

原创 力扣 208.实现Trie(前缀树)

初始化:创建一棵 26 叉树,一开始只有一个根节点 root。26 叉树的每个节点包含一个长为 26 的儿子节点列表 son,以及一个布尔值 end,表示是否为终止节点。遍历字符串 word,同时用一个变量 cur 表示当前在 26 叉树的哪个节点,初始值为 root。如果 word[i] 不是 cur 的儿子,那么创建一个新的节点 node 作为 cur 的儿子。如果 word[i]=a,那么把 node 记录到 cur 的 son[0] 中。

2025-05-31 09:16:17 577

原创 线程创建方式和线程池

• FixedThreadPool:固定线程数线程池,它的核心线程数和最大线程数是一样的。它的特点是线程池中的线程数除了初始阶段需要从 0 开始增加外,之后的线程数量就是固定的,就算任务数超过线程数,线程池也不会再创建更多的线程来处理任务,而是会把超出线程处理能力的任务放到任务队列中进行等待,就算任务队列满了也不会创建临时线程。• CallerRunsPolicy:由提交任务的线程自己执行该任务,也就是直接在调用execute方法的线程中运行(run)被拒绝的任务,但是这种策略会影响系统的整体性能。

2025-05-31 09:14:04 798

原创 力扣 215 .数组中的第K个最大元素

法一:基于快速排序的选择方法以中间元素pivot为基准进行排序后,右指针 r 的位置就是最终全部排序好后pivot的位置,然后去左边或右边递归寻找第k个位置(答案)的元素。// 返回最终排序后数组第k个位置的元素if (left == right) { // 区间只剩一个元素,直接返回 >=也可以!!!不能用<=,是为了防止中轴值(pivot)被多次交换l++;r--;l++;r--;// 递归处理左半部分或右半部分// 目标在左半部分} else {

2025-05-28 09:38:57 420

原创 力扣 739.每日温度

法一:利用单调栈栈中记录还没算出下一个更大元素的那些数的下标。相当于栈是一个 todolist,在循环的过程中,现在还不知道答案是多少,在后面的循环中会算出答案。如73,74,75,71,69,72,76,73 开始栈为空,73的下标0入栈,然后遍历到第二个的时候74>73弹出0,res[0] = 1-0,74的下标1入栈…最后76,73入栈了就一直在栈里面了,res[] 为初始值0i < length;return ans;

2025-05-28 09:37:54 676

原创 力扣 763.划分字母区间

在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。统计每一个字符最后出现的位置从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点i < n;i++) {// 每个字母最后出现的下标i < n;i++) {// 更新当前区间右端点的最大值if (right == i) { // 当前区间合并完毕// 区间长度加入答案。

2025-05-27 10:01:35 784

原创 力扣 56.合并区间

先将二维数组按照左端点从小到大排序,再根据比较左右端点大小来决定是否合并// Lambda 表达式来代替下面的匿名内部类。// 二维数组按照左端点从小到大排序i++){if(i == 0 || res.get(m - 1)[1] < intervals[i][0]){ // 无法合并}else{ // 相交可以合并,更新右端点最大值!!!主要要比较两个的最大值。

2025-05-27 10:00:12 160

原创 力扣 394.字符串解码

/ 数字栈:保存嵌套层级的重复次数// 字符串栈:保存前面已经处理好的字符串// 当前重复次数压栈// 将前面处理好的字符串压栈保存一下multi = 0;// 重置重复次数// 重置当前字符串// 弹出重复次数i++) { // 重复当前层字符串// 拼接外层字符串}else{

2025-05-26 10:38:25 298

原创 力扣 155.最小栈

因为要实现在常数时间内检索到栈中的最小元素,所以使用数组栈,每个数组保存[当前值, 当前最小值]。}else {

2025-05-26 10:36:47 281

原创 力扣 678.有效的括号字符串

需要两个栈分别存储左括号和星号的下标(为了最后判断用星号作为有括号时是否符合题意)。从左到右遍历字符串,进行如下操作:如果遇到左括号,则将当前下标存入左括号栈。如果遇到星号,则将当前下标存入星号栈。如果遇到右括号,则需要有一个左括号或星号和右括号匹配,由于星号也可以看成右括号或者空字符串,因此当前的右括号应优先和左括号匹配,没有左括号时和星号匹配:如果左括号栈不为空,则从左括号栈弹出栈顶元素;如果左括号栈为空且星号栈不为空,则从星号栈弹出栈顶元素;

2025-05-25 10:06:49 306

原创 力扣 74.搜索二维矩阵

j--;}else{i++;

2025-05-25 10:05:43 401

原创 力扣 240.搜索二维矩阵II

int i = 0;// 从右上角开始while (i < matrix.length && j >= 0) { // 还有剩余元素// 找到 targeti++;// 这一行剩余元素全部小于 target,排除} else {j--;// 这一列剩余元素全部大于 target,排除。

2025-05-25 10:04:27 337

原创 黑马点评双拦截器和Threadlocal实现原理

第一个拦截器只进行刷新token操作不拦截,第二个拦截器拦截需要登录的路径,判断ThreadLocal中的是否存在用户信息,如果用户存在就说明登录了就放行,否则执行拦截操作。父线程的值,之后如果子线程自己修改了值,就会一直复用这个值,不会拉取父线程的值,并且也感知不到父线程值得变化。”的策略,元素个数达到阈值(0.75*总容量)时,会先清理掉被垃圾回收掉key的entry对象,然后再检查size是否到阈值,扩容时,数组长度翻倍,并重新计算索引,如果发生哈希冲突,采用线性探测法来解决。

2025-05-24 16:10:24 1217

原创 力扣48 .旋转图像 (最简单的方法)

先上下翻转,整个矩阵翻转完毕之后,再沿着左斜对角线()翻转即可得到最终答案。// 上下翻转i++) {l++;r--;// 左斜对角线(\)翻转i < n;i++) {// 第二层遍历终止条件为 j < ij < i;j++) {

2025-05-24 15:07:02 282

原创 力扣 54 .螺旋矩阵

本文介绍了一个螺旋遍历二维矩阵的Java解法。该方法通过维护四个边界变量(l,r,t,b)来控制遍历方向,依次进行"从左到右"、"从上到下"、"从右到左"和"从下到上"的遍历,每次遍历后调整边界值并检查是否遍历完成。算法时间复杂度为O(mn),空间复杂度为O(1),适用于任意大小的二维矩阵。

2025-05-24 15:04:37 267

原创 力扣 283.移动零 (双指针)

使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。左指针左边均为非零数;左指针到右指针之间均为零。因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。int l = 0;r++) {= 0) {// 交换 nums[r] 和 nums[l]l++;

2025-05-24 15:01:36 248

原创 力扣 49.字母异位词分

注意:// “aet”//经过排序后,字母异位词变成相同的了 ['a', 'e', 't']// "aet"!!!!!易忘。

2025-05-24 09:26:24 136

原创 力扣 128.最长连续序列

/ 把 nums元素全部放入哈希集合中for (int x : st) { // 遍历哈希集合continue;// x 是序列的起点while (st.contains(y)) { // 不断查找下一个数是否在哈希集合中y++;// 循环结束后,y-1 是最后一个在哈希集合中的数// 从 x 到 y-1 一共 y-x 个数return ans;

2025-05-23 08:56:44 200

原创 缓存和数据库一致性问题

采用「先更新数据库,再删除缓存」方案,为了保证两步都成功执行,需配合「消息队列」或「订阅变更日志+MQ」的方案来做,本质是通过「重试」的方式保证数据最终一致更新数据库这一步不容易出现更新失败的情况,因为数据库事务有持久性(redo日志可以保证掉电等故障恢复)但是删除缓存容易出现问题(虽然有持久化…),容易出现断电操作失败情况,解决方式是“重试”。

2025-05-23 08:54:58 1299

原创 力扣 215.数组中的第K个最大元素 ----快速选择做法

基于快速排序的选择方法以中间元素pivot为基准进行排序后,右指针 r 的位置就是最终全部排序好后pivot的位置,然后去左边或右边递归寻找第k个位置(答案)的元素。// 返回最终排序后数组第k个位置的元素if (left == right) { // 区间只剩一个元素,直接返回 >=也可以!!!不能用<=,是为了防止中轴值(pivot)被多次交换l++;r--;l++;r--;// 递归处理左半部分或右半部分// 目标在左半部分} else {// 目标在右半部分。

2025-05-22 09:02:09 561

原创 力扣238.除自身以外数组的乘积

pre[0] = 1;i < n;

2025-05-22 09:00:24 176

原创 力扣 146.LRU缓存 (最简单直观解法)

LRU缓存

2025-05-21 15:23:14 149

原创 目标检测 LW-DETR(2024)详细解读

原始的ViT包含一个分块层和Transformer编码层。(知乎观点)LW-DETR之所以这么用ViT,灵感是来源于kaiming团队的ViTDet,但是,ViT的结构显然是同质的,每一层之间的特征的关联性是很大的,即浅层的特征在深层特征中能够得到很好的保留,那么多层特征拼接的做法除了符合某种“思维惯性”,看不出来什么必要性。另外,考虑到检测任务的图像尺寸一般是大于分类的,此时ViT中的全局自注意力操作便会是显著的计算瓶颈,为了解决这一问题,作者团队便采用了窗口注意力机制,同时,为了保证窗口之间的交互,

2025-05-21 09:42:30 444

原创 目标检测 RT-DETR(2023)详细解读

在使用了这个技巧后,显然训练过程中,类别的标签不再是此前的0和1离散值,而是0~1的连续值。关于 Query Selection(查询向量选择),大家应该并不陌生,这个方法可谓在DETR领域大杀四方,如DAB-DETR对查询向量进行重构理解,将其解释为Anchor,DN-DETR通过查询降噪来应对匈牙利匹配的二义性所导致的训练时间长的问题,DINO提出从Encoder中选择Top-k特征进行学习等一系列方法,这都无疑向我们证明,查询向量很重要,选择好的Query能够让我们事半功倍。在RT-DETR中,

2025-05-21 09:01:44 1888

原创 目标检测 Lite-DETR(2023)详细解读

因此,高效编码器会在一系列高级特征融合之后,以较低的频率更新这些低级特征。对低层级的特征图的token来说,将会耗费太多的计算量,模型的性能提升也比较少,但是也不能去掉这些低层级的特征,因为很多检测需要低层级的特征提供信息。如上图所示,去掉低层级的特征图,Encoder的计算量会得到大幅度的降低,相应小目标的检测精度也会下降,大目标的检测精度没有太大影响。如下图所示, S1 ∼ S3 作为高级特征 ,(a) 是 3.4 节中讨论的建议的高级特征更新,(b) 是 3.5 节中讨论的低级特征跨尺度融合。

2025-05-21 08:54:53 678

原创 目标检测 Focus DETR(2023)详细解读

这种双注意力编码器的设计,既考虑了计算效率,只对少量细粒度tokens进行额外的自注意力计算,也提升了前景特征表示的discrimination,有效地增强了前景语义信息。这篇论文是对Encoder进行改进,因为Encoder阶段输入了大量的token,会占用大量的计算量,因此对Encoder进行改进来减少Encoder的计算量、提高模型的运算效率。为了减少Encoder中的token数量,采用了一个评分的方法,会选取评分高的、更像是前景(有目标)的token,还有就是改进了一个双重注意力网络。

2025-05-21 08:53:29 722

原创 目标检测 Sparse DETR(2022)详细解读

2025-05-21 08:50:54 449

原创 目标检测DINO-DETR(2023)详细解读

与此相反,我们的混合查询选择方法只用前 K 个选定特征来增强位置查询,并保持内容查询的可学习性。在实现上,DINO-DETR拥有两个超参数 λ1,λ2(λ1<λ2) 用于控制正负噪声样本的生成,而DN-DETR只有一个超参数 λ ,DN-DETR控制生成的噪声不超过 λ 并期望网络可以用在gts附近的轻微噪声querys去重构出gts。第三,为了利用后期层的refined box信息来帮助优化相邻早期层的参数,提出了一种新的look forward twice方案,用后面的层的梯度来修正更新后的参数。

2025-05-20 16:29:30 1674

原创 目标检测DN-DETR(2022)详细解读

接着我们取3个batch中最大的target的数量,在这里为9,由于group=5,所有5X9=45,构造噪声query的结构为【3,45,256】,这里注意256的最后一维为indicator标识,值为1,代表噪声。在DAB-Detr的基础上,进一步分析了Detr收敛速度慢的原因:二分图匹配的不稳定性(也就是说它的目标在频繁地切换,特别是在训练的早期),导致早期训练阶段的优化目标不一致(一个query通常在不同的时间段与不同的对象匹配,这使得优化变得模糊和不稳定)

2025-05-20 13:29:16 1129

原创 53.最大子数组和

前缀和+贪心注意计算贪心的时候,遍历前缀和时要从i=1开始遍历,要是从i=0开始遍历;nums =[-1]的示例的输出为错误0i < n;i++) {//!!!注意要从i=1开始遍历,因为求出来的s是前缀和,如果nums全为负数,那么最大子数组和肯定小于0,如果从1开始遍历//会出现最大值为0-0=0i < n + 1;

2025-05-20 10:06:34 230

原创 437.路径总和III

本题做法和 560 题是一样的,前缀和+哈希表。在二叉树上,前缀和相当于从根节点开始的路径元素和。用哈希表 cnt 统计前缀和的出现次数,当我们递归到节点 node 时,设从根到 node 的路径元素和为 s,那么就找到了 cnt[s−targetSum] 个符合要求的路径,加入答案。return ans;return;// 恢复现场。

2025-05-20 10:05:45 187

原创 翻转环形链表的思路

翻转环形链表。

2025-05-19 21:27:58 466

原创 力扣560.和为K的子数组

前缀和+哈希表(两数之和):i < n;i++) {// 设置容量可以快 2msreturn res;错解:这种方法只适用于数组中所有元素都是正数的情况。当数组中包含负数时,滑动窗口就不能保证正确性了。例如,nums = [-1, -1, 1] 和 k = 0,你的算法会漏掉 [-1, -1, 1] 这个子数组。r < len;res++;return res;

2025-05-19 14:44:56 265

原创 力扣303 区域和检索 - 数组不可变

前缀和及其扩展,303.区域和检索 - 数组不可变

2025-05-19 14:42:35 517

原创 二叉树的存储方式和遍历方式

前序遍历、中序遍历、后序遍历

2024-10-28 20:34:18 530

空空如也

空空如也

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

TA关注的人

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